必须在JNDI级别或在Webapp级别建立连接池是否更有意义?例如,我可以这样简单地在javax.sql.DataSource上创建:
<Context antiJARLocking="true">
<Resource name="jdbc/myDataSource"
auth="Container"
type="javax.sql.DataSource"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost/myDataSource" user="user" password="password" />
</Context>
然后在Spring中配置池:
<bean id="myDataSource" class="com.mchange.v2.c3p0.DataSources"
factory-method="pooledDataSource">
<constructor-arg>
<jee:jndi-lookup jndi-name="java:comp/env/jdbc/myDataSource" />
</constructor-arg>
</bean>
或者,我可以直接在JNDI本身中配置池:
<Resource name="jdbc/myDataSource"
auth="Container"
factory="org.apache.naming.factory.BeanFactory"
type="com.mchange.v2.c3p0.ComboPooledDataSource"
driverClassName="com.mysql.jdbc.Driver"
jdbcUrl="jdbc:mysql://localhost/myDataSource"
user="user" password="password"
minPoolSize="3"
maxPoolSize="15"
maxIdleTime="5000"
idleConnectionTestPeriod="300"
acquireIncrement="3" />
离开今年春天:
<jee:jndi-lookup id="myDataSource" jndi-name="java:comp/env/jdbc/myDataSource" />
在这两种情况下,myDataSource弹簧bean都是c3p0连接池数据源,但是哪个更好?我认为在JNDI中拥有池是最有意义的,但是这样做的缺点是必须将c3p0 lib推到servlet容器级别,如果它们当前使用的是其他版本,则可能与现有servlet发生冲突。但是,将其放在JNDI中意味着您的应用程序根本不必担心池化。你们怎么想?
参考方案
您不需要合并从JNDI获得的数据源,因为它已经被合并了:)
拥有容器管理器池v.s.应用程序池是第一种情况,您可以使用标准界面(例如JBoss控制台)监视池中的工作负载。然后,如果需要,应用服务器的管理员将管理有关增加池大小的决策。他还可以将应用程序切换到另一个数据库服务器(例如,计划从MySQL迁移到Oracle)。缺点是您需要花更多的精力为单元测试设置JNDI测试数据源(请参阅here)。
在第二种情况下,是的,您必须将DBCP或c3p0以及JDBC驱动程序与您的应用程序打包在一起。在这种情况下,要收集关于在Tomcat中运行的所有应用程序的所有池的统计信息并不容易。同样,不能一次对所有应用程序迁移到较新的JDBC驱动程序(从MySQL 4到MySQL 5)。即使您使用.property
文件,连接属性也会连接到您的应用程序(因此更改需要重新组装和重新部署项目)。也许您不需要所有这些,因为您只有一个应用程序,一个数据库并且没有管理开销。
有关此主题的更多主题:
在Java中,我们是否有任何方法可以发现特定字符串是字符串数组的一部分。我可以避免出现一个循环。例如String [] array = {"AA","BB","CC" }; string x = "BB" 我想要一个if (some condition to tell wheth…
Java Globbing模式以匹配目录和文件 - java我正在使用递归函数遍历根目录下的文件。我只想提取*.txt文件,但不想排除目录。现在,我的代码如下所示:val stream = Files.newDirectoryStream(head, "*.txt") 但是这样做将不会匹配任何目录,并且返回的iterator()是False。我使用的是Mac,所以我不想包含的噪音文件是.DS_ST…
Java RegEx中的单词边界\ b - java我在使用\b作为Java Regex中的单词定界符时遇到困难。对于text = "/* sql statement */ INSERT INTO someTable"; Pattern.compile("(?i)\binsert\b");找不到匹配项Pattern insPtrn = Pattern.compile(&…
Java Double与BigDecimal - java我正在查看一些使用双精度变量来存储(360-359.9998779296875)结果为0.0001220703125的代码。 double变量将其存储为-1.220703125E-4。当我使用BigDecimal时,其存储为0.0001220703125。为什么将它双重存储为-1.220703125E-4? 参考方案 我不会在这里提及精度问题,而只会提及数字…
当回复有时是一个对象有时是一个数组时,如何在使用改造时解析JSON回复? - java我正在使用Retrofit来获取JSON答复。这是我实施的一部分-@GET("/api/report/list") Observable<Bills> listBill(@Query("employee_id") String employeeID); 而条例草案类是-public static class…