如何在Tomcat中创建没有池的数据源

时间:2009-08-04 20:44:38

标签: java tomcat jdbc jndi apache-commons-dbcp

我使用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 个答案:

答案 0 :(得分:2)

不太确定,如果这可以满足您的要求,但您可以在不使用Tomcat管理的数据源的情况下始终使用Spring JDBC support

答案 1 :(得分:0)

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

答案 2 :(得分:0)

如果您真的只想要一个连接,请尝试在DBCP configuration中将in​​tialSize设置为1,将maxActive设置为1.

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

编辑:

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

是的,如果你通过使池大小为1来有效地关闭池,那就会发生。但是你的问题的标题是“如何在没有汇集的情况下创建数据源”,所以我对你究竟要完成什么感到困惑。

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

答案 3 :(得分: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" />