我有一个Java Web应用程序连接到另一台机器上运行的Oracle数据库(不确定这是否相关).我正在使用DBCP进行连接池.Web应用程序在JBoss 4.2.2中运行,我们将数据源定义为Spring中的bean.
我们正在使用Hibernate进行ORM.
我们偶尔会遇到错误:"ORA-02396:超过最大空闲时间,请再次连接".
我尝试将名为"removeAbandoned"(true)和"removeAbandondedTimeout"(120)的DBCP BasicDataSource添加属性无效.
任何帮助,将不胜感激.如果我需要提供更多信息,请告诉我 - 我不是那么了解连接池的内部工作等等...
这是我使用DBCP 1.4连接工厂创建DataSource的方法:
PoolableConnectionFactory factory = new PoolableConnectionFactory(
new DriverManagerConnectionFactory("jdbc:h2:mem:db", "", ""),
new GenericObjectPool(null),
null,
"SELECT 1",
false,
true
);
DataSource src = new PoolingDataSource(factory.getPool());
Run Code Online (Sandbox Code Playgroud)
工作正常,但我不知道如何配置它,参数列在这里:http://commons.apache.org/dbcp/configuration.html.例如,我需要设置testWhileIdle为true.
我有一段时间远离Java EE,但我对所有这些东西都有一个基本的想法.
我在这里阅读JTDS文档:
http://jtds.sourceforge.net/features.html
它说它提供了语句池和连接池,但没有提供连接池实现.
随意添加更多细节到您的答案
(无论您发现什么重要;我没有明确询问的事情),
因为我对此非常困惑.
到目前为止,我们使用MS JDBC Driver 4.0使用集成安全性和Java Kerberos连接到SQL Server 2008,一切正常.
这是代码:
春天背景:
<!-- ***** Data Source Configuration ***** -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName" value="com.microsoft.sqlserver.jdbc.SQLServerDriver" />
<property name="url"
value="jdbc:jtds:sqlserver://<serverName>:<port>;databaseName=<DBName>;integratedSecurity=true;authenticationScheme=JavaKerberos; />
<property name="initialSize" value="5" />
<property name="maxActive" value="2" />
<property name="defaultAutoCommit" value="false" />
</bean>
<!-- ***** Transaction Manager ***** -->
<bean id="txManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<tx:annotation-driven transaction-manager="txManager" />
<!-- ***** JDBC Configuration ***** -->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<constructor-arg type="javax.sql.DataSource" ref="dataSource" />
</bean>
Run Code Online (Sandbox Code Playgroud)
login.conf文件:
com.sun.security.jgss.krb5.initiate {
com.sun.security.auth.module.Krb5LoginModule required
useTicketCache=false
doNotPrompt=true
useKeyTab=true …Run Code Online (Sandbox Code Playgroud) 编辑:虽然给出并给出了一个(好的)答案,但这只涉及我的问题中一个相当不重要的部分.这个问题的主要部分仍然是开放的.
我在云项目中使用EclipseLink(2.6.2).该项目是一个打包为WAR文件并部署在Apache Tomcat 8上的Web应用程序.持久化上下文是使用Java代码设置的,我在其中指定要使用的实体entityManagerFactoryBean.setPackagesToScan(packagesToScan).此配置通常按预期工作,其中确切地找到指定包中的实体类.
我现在无法理解何时使用哪个类加载器,尤其是在考虑Tomcat,运行测试和使用不同的连接池实现时.
在包含Tomcat连接池的Apache Tomcat上运行时,DataSource使用spring-cloud-connectorplugin(spring-cloud-spring-service-connector)创建实例.在这个设置中,一切都按预期工作,只要我不改变下面描述的类加载器(否则我面对ClassNotFoundException实体类).
当的帮助下运行单元测试JUnit和spring-test的DataSource实例使用的内存数据库H2(使用创建EmbeddedDatabaseBuilder的spring-jdbc).在此设置中,我必须指定JPA以使用用于DataSource实例的类加载器(eclipselink.classloaderJPA属性映射中的键),否则我得到"对象...不是已知的实体类型".
在嵌入式Apache Tomcat 8中运行测试时,我看不到任何指示正在使用的连接池的消息.在这个设置中,我还必须为单元测试设置类加载器.
如果我将commons-dbcp(2.1.1)添加到我的项目并显式配置spring-cloud-connector插件以使用它而不是Tomcat的连接池,我可以在Tomcat上运行应用程序而无需配置类加载器,但它也适用于上述类加载器规范.
对于测试,commons-dbcp与上面概述的情况相比,没有任何改变(因为没有使用相应的配置).
摘要:
DataSourceJPA的类加载器你能帮我理解这里的不同之处,并建议一个适合所有情况的简单解决方案吗?我假设DBCP和Spring使用与Tomcat(和Tomcat的连接池)不同的类加载器.
如果您需要更多信息,我很乐意添加它.
编辑:我添加了一个示例项目,其中包含有关如何重现的大型自述文件.
在我的项目中,Spring使用org.apache.commons.dbcp.BasicDataSource类管理连接池.是否可以获取当前时间内有多少个免费或使用的连接?
谢谢.
我想知道那里是否有任何重大问题.在我的项目中升级jar后,编译完所有内容.我没有在发行说明中看到任何让我不寒而栗的东西,但我想仔细检查一下.
java upgrade backwards-compatibility apache-commons apache-commons-dbcp
我正在使用Spring和DBCP,并且当操作环境上的某些配置发生更改时需要刷新我的数据源,而无需重新启动所有应用程序.
如果我在不使用DBCP的情况下执行此操作,则强制此刷新关闭当前正在打开的数据源并启动DataSource的新实例.
使用DBCP + Spring,我不能这样做.
有人知道是否有可能吗?
我正在尝试BasicDataSource使用DBCP建立与Oracle数据库的连接.
我commons-dbcp-1.4-bin.zip从这里下载了.
类路径上有三个jar文件.
我正在使用以下代码建立连接.
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import org.apache.commons.dbcp.BasicDataSource;
public class DatabaseConnection {
private final static BasicDataSource BASIC_DATA_SOURCE = new BasicDataSource();
private final static String SQL = "SELECT * FROM admin WHERE login_id=? AND admin_pwd=?";
static {
BASIC_DATA_SOURCE.setDriverClassName("oracle.jdbc.OracleDriver");
BASIC_DATA_SOURCE.setUrl("jdbc:oracle:thin:@localhost:1521:xe");
BASIC_DATA_SOURCE.setUsername("wagafashiondb");
BASIC_DATA_SOURCE.setPassword("root");
}
private static Connection getConnection() throws SQLException {
return BASIC_DATA_SOURCE.getConnection();
}
public boolean exists(String userName, String password) throws SQLException {
Connection …Run Code Online (Sandbox Code Playgroud) 我试图了解org.apache.commons.dbcp.BasicDataSource中的maxWait是什么.文档说它是:
池将在抛出异常之前返回的连接等待(当没有可用连接时)的最大毫秒数,或<= 0无限期等待.
但我还是无法理解.我试着去谷歌,但我的怀疑只是增加了.
我看到两种解释这个定义的方法:
请帮助我理解哪个陈述是真的.或者可能还有其他一些定义:)
java ×10
jdbc ×2
jtds ×2
spring ×2
classloader ×1
datasource ×1
eclipselink ×1
java-ee ×1
jpa ×1
kerberos ×1
oracle ×1
oracle10g ×1
upgrade ×1