2

我使用 JNDI 上下文在 Tomcat 的 context.xml 文件中为 JDBC 驱动程序创建数据源,如下所示,

<Resource name="db/test" 
          type="javax.sql.DataSource" 
          driverClassName="com.test.jdbc.Driver"
          url="jdbc:fastdb://localhost:3306/session_db?autoReconnect=true&amp;connectTimeout=5000&amp;socketTimeout=5000"
          zeroDateTimeBehavior="convertToNull"
          username="dbuser"
          password="password"
          maxActive="100"
          maxWait="2"
          removeAbandoned="true"
          removeAbandonedTimeout="60"
          logAbandoned="true" />

默认情况下,Tomcat 将使用 DBCP 数据源工厂并创建池化数据源。我们使用的特定数据库和驱动程序已经支持较低级别的池化,而额外的池化实际上会损害性能。有没有像这样使用 JNDI 资源创建基本数据源(没有池),这样我就可以在不同的数据库之间切换,而配置更改最少?

我知道我可以编写自己的数据源工厂或使用其他驱动程序的数据源工厂来实现这一点,但我正在寻找一个更简单的解决方案。

4

4 回答 4

2

不太确定,如果这会让您满意,但您始终可以使用Spring JDBC 支持,而无需使用 Tomcat 管理的数据源。

于 2009-08-04T22:15:13.040 回答
0

您正在使用的 JDBC 驱动程序是否提供了javax.naming.spi.ObjectFactory您可以使用的配置或其他连接对象的实现org.apache.naming.factory.BeanFactory?这些解决方案中的任何一个都不需要您编写自定义代码或添加任何额外的第三方库。

于 2009-08-05T19:24:01.447 回答
0

如果您真的只想要一个连接,请尝试在DBCP 配置中将 intialSize 设置为 1 并将 maxActive 设置为 1 。

从长远来看,如果您不想使用连接池,那么就不要使用 JNDI 来配置您的数据源,只需直接在您的 Web 应用程序的代码中创建它即可。

编辑:

在您的评论中,您说:“它只允许一个连接,并且服务器立即挂起,因为每个请求都在等待连接。”

是的,如果您通过将池大小设置为 1 来有效地关闭池化,就会发生这种情况。但是你的问题的标题是“如何在没有池的情况下创建数据源”所以我对你到底想要完成什么感到困惑。

我的建议是不要使用 JNDI 来定义您的连接(定义 JNDI 数据源的全部目的是用于跨 Web 应用程序的连接池)。相反,在您的 servlet 代码中为您的两种情况定义连接,一种情况继续使用 DBCP,另一种情况使用您的其他低级连接池。

于 2009-08-05T21:23:29.490 回答
0

我为这样的 Oracle 非池连接做了它:

<Resource
        name="jdbc/aqds"
        auth="Container"
        type="oracle.jdbc.pool.OracleDataSource"
        factory="oracle.jdbc.pool.OracleDataSourceFactory"
        url="jdbc:oracle:thin:@localhost:1521:XE"
        user="MYUSER"
        password="MYPASSWORD" />
于 2016-03-02T12:15:28.550 回答