一尘不染

在Tomcat中使用动态数据源

tomcat

我正在为我的应用程序创建一系列Web服务,并且我需要基于在WebService调用中作为参数传递的serviceCode访问不同的数据库。

我用tomcat设置了一个基本资源来访问这样的数据库

<Resource name="jdbc/db_name" auth="Container" type="javax.sql.DataSource"
maxActive="100" maxIdle="30" maxWait="10000"
username="user" password="pass" driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://server_ip:3306/db_name"/>

但是以这种方式,我必须为我在服务器上创建的每个数据库,我想要的以及我没有找到信息(或不理解)的资源设置资源,才能将db_name设置为一个变量,是在运行时从Web服务传递的,因此基本上只有一个资源并且可以动态地使用它,而不是每个数据库都有一个资源(这要求我每次创建新数据库时都要启动服务器来更改context.xml)

我这样使用scalaquery访问资源

val db = Database.forDataSource(datasource("jdbc/db_name"))

这就是我希望能够动态传递db_name或在运行时定义资源的地方,tomcat / scala是否有另一种方法,还是我每次都必须添加资源?


阅读 243

收藏
2020-06-16

共1个答案

一尘不染

定义您自己的资源。请参阅Tomcat文档。您提供javax.naming.spi.ObjectFactory的实现。让它返回适当的Context实现,以便通过某个名称查找它会返回该名称的数据库连接。就我而言,context.xml中所需的条目如下所示:

<Resource
    name="ldap/Context" // your name, probably something like jdbc/dynamic
    auth="Container"
    type="javax.naming.ldap.LdapContext"
    factory="com.xxxx.ldap.LdapContextFactory"
    // your initialization params here, if any
    >
2020-06-16