我收到了ORA-01000 SQL异常.所以我有一些与之相关的问题.
在循环中执行预准备语句会导致此问题吗?(当然,我本可以使用sqlBatch)注意:一旦循环结束,pStmt就会关闭.
{ //method try starts
String sql = "INSERT into TblName (col1, col2) VALUES(?, ?)";
pStmt = obj.getConnection().prepareStatement(sql);
pStmt.setLong(1, subscriberID);
for (String language : additionalLangs) {
pStmt.setInt(2, Integer.parseInt(language));
pStmt.execute();
}
} //method/try ends
{ //finally starts
pStmt.close()
} //finally ends
Run Code Online (Sandbox Code Playgroud)如果在单个连接对象上多次调用conn.createStatement()和conn.prepareStatement(sql)会发生什么?
Edit1: 6.使用Weak/Soft引用语句对象是否有助于防止泄漏?
Edit2: 1.有什么办法,我可以在项目中找到所有缺少的"statement.close()"吗?我知道这不是内存泄漏.但我需要找一个符合垃圾收集条件的语句引用(不执行close())?有什么工具可用?或者我必须手动分析它?
请帮我理解.
转到ORALCE机器并以sysdba启动sqlplus.
[oracle@db01 ~]$ sqlplus / as sysdba
Run Code Online (Sandbox Code Playgroud)
然后跑
SELECT A.VALUE,
S.USERNAME,
S.SID,
S.SERIAL#
FROM V$SESSTAT A,
V$STATNAME B,
V$SESSION S
WHERE A.STATISTIC# = B.STATISTIC#
AND …Run Code Online (Sandbox Code Playgroud) 我从错误消息中读到了这个建议:
您应该考虑在应用程序中使用之前过期和/或测试连接有效性,增加服务器配置的客户端超时值,或使用Connector/J连接属性"autoReconnect = true"来避免此问题.
我正在使用Spring和JPA.我应该在哪里配置Connector/J?(在弹簧配置中persistence.xml,或在entityManagerFactory弹簧配置中,或在dateSource其他地方?)
我有一个基本的Spring JDBC应用程序,它具有非常基本的配置:
<bean id="myDataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="oracle.jdbc.OracleDriver"/>
<property name="url" value="jdbc:oracle:thin:@1.1.1.1:1521:XXX"/>
<property name="username" value="username"/>
<property name="password" value="password"/>
</bean>
<bean id="dbThing" class="com.DbThing">
<property name="dataSource" ref="myDataSource"/>
</bean>
Run Code Online (Sandbox Code Playgroud)
我想介绍一个连接池,并在阅读了几个线程后,我对使用哪个池库感到有点困惑.
似乎在SO上有更多学分的图书馆是CP30和DBCP.由于我使用的是Oracle,我还可以使用驱动程序提供的池数据源.我知道有更多的库可用 - 例如新的Apache Tomcat 7池库.
有没有我应该避免的图书馆?
我应该在给定的库中使用任何推荐的配置吗?
你想分享的任何"战争故事"?
以下是我的帮助类获取数据库连接:
我已经使用了这里描述的C3P0连接池.
public class DBConnection {
private static DataSource dataSource;
private static final String DRIVER_NAME;
private static final String URL;
private static final String UNAME;
private static final String PWD;
static {
final ResourceBundle config = ResourceBundle
.getBundle("props.database");
DRIVER_NAME = config.getString("driverName");
URL = config.getString("url");
UNAME = config.getString("uname");
PWD = config.getString("pwd");
dataSource = setupDataSource();
}
public static Connection getOracleConnection() throws SQLException {
return dataSource.getConnection();
}
private static DataSource setupDataSource() {
ComboPooledDataSource cpds = new ComboPooledDataSource();
try {
cpds.setDriverClass(DRIVER_NAME);
} …Run Code Online (Sandbox Code Playgroud) 我在Spring配置中使用DBCP数据源(使用默认配置)来管理我与数据库的连接,并且当客户端数量增加时,我遇到了死锁状态.
我发现在我使用的DBCP 1.2.1中存在死锁问题,应该在1.4中解决.所以我升级到1.4,但问题仍然存在.
在线程转储中,有许多线程被阻塞,顶部有以下堆栈跟踪:
java.lang.Thread.State: WAITING on org.apache.commons.pool.impl.GenericObjectPool$Latch@b6b09e
at java.lang.Object.wait(Native Method)
at java.lang.Object.wait(Object.java:485)
at org.apache.commons.pool.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:1104)
at org.apache.commons.dbcp.PoolingDataSource.getConnection(PoolingDataSource.java:106)
at org.apache.commons.dbcp.BasicDataSource.getConnection(BasicDataSource.java:1044)
at org.springframework.jdbc.datasource.DataSourceTransactionManager.doBegin(DataSourceTransactionManager.java:200)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTransactionManager.java:350)
at org.springframework.transaction.interceptor.TransactionAspectSupport.createTransactionIfNecessary(TransactionAspectSupport.java:261)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:101)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:160)
at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:89)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
at org.springframework.aop.framework.Cglib2AopProxy$DynamicAdvisedInterceptor.intercept(Cglib2AopProxy.java:631)
Run Code Online (Sandbox Code Playgroud)
欢迎任何建议!
我在我的Java项目中使用BoneCP.但是,遗憾的是,我发现数据库发生故障后该池无法恢复.我不是唯一一个有这种问题的人(如果你想要看官方论坛).由于我(和许多其他人)从未在bonecp论坛上得到答案,似乎不再支持这个项目,我的问题不太可能得到解决.
因此,我正在寻找一个替代的主动开发和支持的连接池库,它能够正确处理数据库中断,并在数据库再次可用时立即恢复.
在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>
Run Code Online (Sandbox Code Playgroud)
然后在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>
Run Code Online (Sandbox Code Playgroud)
或者,我可以直接在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" />
Run Code Online (Sandbox Code Playgroud)
离开这个春天:
<jee:jndi-lookup id="myDataSource" jndi-name="java:comp/env/jdbc/myDataSource" />
Run Code Online (Sandbox Code Playgroud)
在这两种情况下,myDataSource spring bean都是一个c3p0连接池数据源,但哪一个更好?我认为在JNDI中使用池是最有意义的,但缺点是你必须将c3p0 lib推送到servlet容器级别,这可能会导致与现有servlet冲突,如果它们当前使用不同的版本.但是,将它放在JNDI中意味着您的应用程序根本不必担心池化.你们都在想什么?
我最近遇到了这个连接池实现.
http://people.apache.org/~fhanik/jdbc-pool/jdbc-pool.html
我觉得很有意思.
有没有人试过这个?我认为它看起来很棒,除了它不支持自动重试和语句缓存,如c3p0.
有没有人知道它与c3p0相比如何?
直到现在我使用了c3p0,但我发现它在多线程环境中的连接处理存在问题.与应用程序线程数相比,它打开了太多连接.
谢谢.
我想使用JDBC连接池.最重要的因素是它易于使用且无错误.什么适合我?
设置游泳池的最佳方法是: -
我认为这是一个不可知的问题,但欢迎对特定数据库/语言的"特征"发表评论.例如,在某些数据库上连接可能比其他数据库更慢或更昂贵.
为了澄清,我不打算从头开始编写池,这个问题更多的是关于如何配置实现池的现有库.