java.sql.resultsetSQLExcepti...

java.sql.Connection的close方法究竟干了啥(以MySQL为例)
谨将此文送给和我一样具有考据癖的程序员,希望能帮到大家&&&&
闲言少叙,上代码。
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
Class.forName(&com..jdbc.Driver&);
Connection conn = DriverManager.getConnection(
&jdbc:mysql://localhost:3306/financial_db&, &root&, &admin&);
conn.close();
System.out.println(conn.isClosed()); // true after conn.close() if no exception
System.out.println(conn == null); // not null after conn.close()
Connection emptyConn =
emptyConn.isClosed(); // NullPointerException
1. java.sql.Connection.close()方法做的是立刻释放connection对象占用的联接资源,而不是等到JVM的垃圾回收机制将其回收。并不是像我原以为的那样,close方法会简单地将conn对象设置为null。事实上,在调用close()之后,conn仍然不为null。
2. 对一个为null的connection,调用close()方法会报空指针异常。
当然,如果你只是想知道为什么关闭一个Connection要用close方法而不是直接置为null,或者等待其被垃圾回收,那么看到这里你就可以关闭窗口了。如果你和我一样,对这个close方法究竟干了啥感兴趣,那么请不厌其烦接着往下看。
这个close方法究竟干了啥,好,读了MySQL Connector/J 的代码,接着写:
java.sql.Connection自身是一个接口,具体怎么实现是由JDBC自己实现的。MySQL中的实现是
1. 先用com.mysql.jdbc.Connection接口来继承java.sql.Connection接口:
public interface Connection extends java.sql.Connection, ConnectionProperties
2. 再用com.mysql.jdbc.MySQLConnection继承com.mysql.jdbc.Connection接口:
public interface MySQLConnection extends Connection, ConnectionProperties
3.最后使用com.mysql.jdbc.ConnectionImpl来实现com.mysql.jdbc.MySQLConnection接口:
public class ConnectionImpl extends ConnectionPropertiesImpl implements MySQLConnection
此处猜想,如果使用MySQL Connector/J来联接MySQL数据库,通过java.sql.DriverManager.getConnection(...)方法获得的Connection对象其类型应该是com.mysql.jdbc.ConnectionImpl(准确地说应该是其本身或其子类). 代码证明:
public static void main(String[] args) throws Exception {
Class.forName(&com.mysql.jdbc.Driver&);
Connection conn = DriverManager.getConnection(
&jdbc:mysql://localhost:3306/financial_db&, &root&, &admin&);
System.out.println(conn instanceof com.mysql.jdbc.ConnectionImpl); // true
结果为true,假设成立。
找到com.mysql.jdbc.ConnectionImpl的close方法,我们中使用的java.sql.Connection.close()方法其在MySQL Connector/J的实现就是该方法,如下:
* In some cases, it is desirable to immediately release a Connection's
* database and JDBC resources instead of waiting for them to be
* automatically released (cant think why off the top of my head) &B&Note:&/B&
* A Connection is automatically closed when it is garbage collected.
* Certain fatal errors also result in a closed connection.
* @exception SQLException
if a database access error occurs
public void close() throws SQLException {
synchronized (getConnectionMutex()) {
if (this.connectionLifecycleInterceptors != null) {
new IterateBlock&Extension&(this.connectionLifecycleInterceptors.iterator()) {
void forEach(Extension each) throws SQLException {
((ConnectionLifecycleInterceptor) each).close();
}.doForAll();
realClose(true, true, false, null);
官方的注释说,这个方法用在那些需要立即释放连接资源的情况下。一个连接在被垃圾回收的时候是自动关闭的,并且一些致命错误(fatal errors)也会导致这个连接关闭。
通过代码可以发现,close这个方法里面,真正释放连接资源的是最下面这个realClose方法(上面的ConnectionLifecycleInterceptor在jdbc的代码里只找到一个接口,貌似具体的实现和MySQL的附件有关),原文这么说:Implementors of this interface can be installed via the &connectionLifecycleInterceptors& configuration property and receive events and alter behavior of &lifecycle& methods on our connection implementation. (这个接口的实现可以通过connectionLifecycleInterceptors configuration property来安装,接收时间并且改变我们connection实现当中的lifecycle方法的行为)。这不是重点,重点是下面这个realClose。代码太长,我贴在最后。
通过realClose的代码,可以发现这个方法有四个参数,前三个都是boolean类型,第四个是Throwable类型。calledExplicitly为这个方法是否是从close()方法调用的,issueRollback表示在释放资源的时候是否需要回滚操作rollback()。后两个参数没有给出注释,只好顾名思义,skipLocalTeardown表示是否跳过local teardown(在google上没有搜到什么有价值的结果&&),reason最终在代码中被赋值给ConnectionImpl的forceClosedReason(Why was this connection implicitly closed, if known? (for diagnostics) 为什么这个连接是隐式关闭的,如果原因可知(诊断用))。这两个参数和我们研究的问题关系不大。realClose核心代码在此:
if (!skipLocalTeardown) { // part 1 starts
&strong&closeAllOpenStatements();&/strong&
} catch (SQLException ex) {
} // part 1 ends
if (this.io != null) { // part 2 starts
&strong&this.io.quit();&/strong&
} catch (Exception e) {
&strong&this.io.forceClose();&/strong&
} // part 2 ends
if (this.statementInterceptors != null) { // part 3 starts
for (int i = 0; i & this.statementInterceptors.size(); i++) {
this.statementInterceptors.get(i).destroy();
if (this.exceptionInterceptor != null) {
this.exceptionInterceptor.destroy();
} // part 3 ends
} finally {
// part 4 starts
this.openStatements =
if (this.io != null) {
&strong&this.io.releaseResources();&/strong&
this.statementInterceptors =
this.exceptionInterceptor =
&strong&ProfilerEventHandlerFactory.removeInstance(this);&/strong&
synchronized (getConnectionMutex()) {
if (this.cancelTimer != null) {
&strong&this.cancelTimer.cancel();&/strong&
&strong&this.isClosed =&/strong&
// part 4 ends
在代码中做了注释,
part 1 通过closeAllIOpenStatements方法关闭了该连接中所有处于打开状态的声明statement,
part 2 用来关闭连接的IO(通过quit或forceClose方法),
part 3 用来销毁(destroy)连接的声明拦截器(statement interceptor)和异常拦截器(exception interceptor),
part 4 将上述已经关闭的openStatements, IO (如果IO不为null,则通过releaseResources方法释放资源), statementInterceptors和exceptionInterceptor置为null,并删除掉这个连接对应的的ProfilerEventHandler(这个类在jdbc的里就是孤零零一个接口,没有对应注释),将连接的cancelTimer计时器取消掉,再将连接的isClosed属性设置为true(代码中看到的isClosed方法就是返回这个属性的值)。
所以,通过这些代码,我们大概可以看出MySQL JDBC在建立一个连接的时候需要申请使用什么样的资源,至于这些资源有什么用,我再研究研究,后面的文章里再接着跟大家唠。^_^
写到这里才发现自己蠢哭了T_T,如果close方法只是将Connection置为null,那么怎么调用isClosed方法呢?唉,too young too naive,写了这么半天才转过弯来。 T_T
不过通过阅读代码,发现realclose方法将释放后的资源对象的引用都置为了null,这是一个启发,以后在对connection调用完close方法之后,再将其设置为null,免得写着写着就忘了这连接已经被关闭不能使用了(因为会直接NullPointerException),也算是减少潜在的bug风险。总之,读一趟代码下来,收获还是挺大的。听周围很多外国同行说,我们国内的程序员不愿意和大家分享自己的收获和所得,听着惭愧啊。好,这边一点了都,写到这里,感谢一下中间给我递雪糕的室友,我们下篇文章再见。Cya.
附com.jdbc.mysql.ConnectionImpl.realClose方法完整源码,感兴趣大家可以一起研究,哈哈:
* Closes connection and frees resources.
* @param calledExplicitly
is this being called from close()
* @param issueRollback
should a rollback() be issued?
* @throws SQLException
if an error occurs
public void realClose(boolean calledExplicitly, boolean issueRollback, boolean skipLocalTeardown, Throwable reason) throws SQLException {
SQLException sqlEx =
if (this.isClosed()) {
this.forceClosedReason =
if (!skipLocalTeardown) {
if (!getAutoCommit() && issueRollback) {
rollback();
} catch (SQLException ex) {
reportMetrics();
if (getUseUsageAdvisor()) {
if (!calledExplicitly) {
String message = &Connection implicitly closed by Driver. You should call Connection.close() from your code to free resources more efficiently and avoid resource leaks.&;
this.eventSink.consumeEvent(new ProfilerEvent(ProfilerEvent.TYPE_WARN, &&, this.getCatalog(), this.getId(), -1, -1, System
.currentTimeMillis(), 0, Constants.MILLIS_I18N, null, this.pointOfOrigin, message));
long connectionLifeTime = System.currentTimeMillis() - this.connectionCreationTimeM
if (connectionLifeTime & 500) {
String message = &Connection lifetime of & .5 seconds. You might be un-necessarily creating short-lived connections and should investigate connection pooling to be more efficient.&;
this.eventSink.consumeEvent(new ProfilerEvent(ProfilerEvent.TYPE_WARN, &&, this.getCatalog(), this.getId(), -1, -1, System
.currentTimeMillis(), 0, Constants.MILLIS_I18N, null, this.pointOfOrigin, message));
closeAllOpenStatements();
} catch (SQLException ex) {
if (this.io != null) {
this.io.quit();
} catch (Exception e) {
this.io.forceClose();
if (this.statementInterceptors != null) {
for (int i = 0; i & this.statementInterceptors.size(); i++) {
this.statementInterceptors.get(i).destroy();
if (this.exceptionInterceptor != null) {
this.exceptionInterceptor.destroy();
} finally {
this.openStatements =
if (this.io != null) {
this.io.releaseResources();
this.statementInterceptors =
this.exceptionInterceptor =
ProfilerEventHandlerFactory.removeInstance(this);
synchronized (getConnectionMutex()) {
if (this.cancelTimer != null) {
this.cancelTimer.cancel();
this.isClosed =
if (sqlEx != null) {
throw sqlEx;
(window.slotbydup=window.slotbydup || []).push({
id: '2467140',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467141',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467142',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467143',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467148',
container: s,
size: '1000,90',
display: 'inlay-fix'java.sql.SQLException: 违反协议异常的一种解释 -
- ITeye技术网站
博客分类:
一次做应用升级出现了一个问题,描述如下:
&& 升级分为两块,一块是数据库结构变更(表结构增加新字段);一块是应用程序的升级。
&& 应用环境为:jboss4.0.5 + ibatis + spring 数据源在jboss的oracle-ds.xml文件中进行配置,通过spring的jndi方式进行查找 。
&& 我先将数据库进行升级,更改表结构(增加字段),因为应用中的ibatis的查询采用的是ResultMap返回方式,返回定义的表结构字段,即使数据库发生变更,也不会产生影响。于是我大胆的进行脚本的执行。结果当我下午16:00数据库变更之后,几乎在同时就有人反应应用的一些查询功能无法使用,立刻查看出错日志:
Caused by: com.alibaba.generalorm.dao.DataAccessException: Data query error!
--- The error occurred in sqlmap/CiaDissension.xml.
--- The error occurred while applying a parameter map.
--- Check the QUERY_ALL_DISSENSION_CATEGORY-InlineParameterMap.
--- Check the statement (query failed).
--- Cause: java.sql.SQLException: OALL8 处于不一致状态
at com.alibaba.ibatis.BasicIBatisDao.query(BasicIBatisDao.java:315)
at com.alibaba.china.rcc.riskdc.dao.DissensionCategoryDAO.getAll(DissensionCategoryDAO.java:40)
at com.alibaba.china.rcc.riskdc.service.impl.DissensionServiceImpl.getCategoryMap(DissensionServiceImpl.java:495)
at com.alibaba.china.rcc.riskdc.service.impl.DissensionServiceImpl.getCategory(DissensionServiceImpl.java:188)
at com.alibaba.china.rcc.riskdc.web.action.DissensionAction.getCategory(DissensionAction.java:263)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at com.alibaba.webx.action.invoker.AbstractModuleMethodInvoker.executeNoArgMethod(AbstractModuleMethodInvoker.java:401)
... 33 more
Caused by: com.alibaba.generalorm.dao.DataAccessException: Data query error!
--- The error occurred in sqlmap/CiaDissension.xml.
--- The error occurred while applying a parameter map.
--- Check the QUERY_ALL_DISSENSION_BUSINESS-InlineParameterMap.
--- Check the statement (query failed).
--- Cause: java.sql.SQLException: 违反协议
at com.alibaba.ibatis.BasicIBatisDao.query(BasicIBatisDao.java:315)
at com.alibaba.china.rcc.riskdc.dao.DissensionBusinessDAO.getAll(DissensionBusinessDAO.java:19)
at com.alibaba.china.rcc.riskdc.service.impl.DissensionServiceImpl.getBusiness(DissensionServiceImpl.java:178)
at com.alibaba.china.rcc.riskdc.web.action.DissensionAction.getBusiness(DissensionAction.java:249)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at com.alibaba.webx.action.invoker.AbstractModuleMethodInvoker.executeNoArgMethod(AbstractModuleMethodInvoker.java:401)
... 33 more
为什么会出现违反协议的问题?马上google一下,有些人说是因为数据库的字段类型与java中使用的类型不一致导致,但查看了ibtais的map文件,老的应用代码根本还没有使用新的的字段!后来找pla共同排查,也没有发现应用程序哪里会出现问题,便打电话给DBA让他查下数据库,DBA咨询了一位资格较老的DBA,他说以前也出现过这种情况,只要将应用重启下,就好了。马上重启,果然问题解决了,违反协议的错误没有再报。
查找原因:
在做升级前,我自己在开发环境也做过模拟,并没有出现如果应用不重启,数据库变更而报“违反协议”的错误。而我看了下发布环境与开发环境差异,唯一的差异是开发环境没有采用jboss+jndi的方式获取数据源,而采用了tomcat+c3p0的方式获取数据源。
于是我开始实验。
Tomcat+C3P0启动方式:
1.准备好更改数据库脚本。
2.在开发环境用tomcat启动应用,并访问到涉及表结构变更的页面。
3.执行数据库脚本,确保表结构发生了变更。
4.刷新在步骤2的页面,查看后台输出和前台页面输出。
5.一切正常,没有抛出违反协议或处于不一致状态的错误日志。
JBoss4.0.5+JNDI启动方式
1.准备好更改数据库脚本。
2.在开发环境用jboss启动应用,并访问到涉及表结构变更的页面。
3.执行数据库脚本,确保表结构发生了变更。
4.刷新在步骤2的页面,查看后台输出和前台页面输出。
5.出现了违反协议和处于不一致状态的问题。
由此可以看出,出现这个问题与ibatis没有关系,而与数据源的获取方式有关,一种是通过Spring+c3p0直接注入DataS一种是在oracle-ds.xml文件中配置,然后在spring中通过jndi的方式进行查找,获取数据源。第二种在数据库变更的情况下,就必须进行应用重启,否则就会抛出违反协议或处于不一致的状态。
但根本原因到底是什么呢?我还在寻找。
===================================================
咨询了大少,并不是因为数据源配置模式没有关系,用c3p0或者jndi等,而是与数据源的配置方式有关:
在oracle-ds的配置如下:
&local-tx-datasource&
&jndi-name&rccBopsDataSource&/jndi-name&
&use-java-context&false&/use-java-context&
&connection-url&jdbc:oracle:thin:@xx.xx.xx.xx:1521:xx&/connection-url&
&connection-property name="SetBigStringTryClob"&true&/connection-property&
&connection-property name="defaultRowPrefetch"&50&/connection-property&
&connection-property name="clientEncoding"&GBK&/connection-property&
&connection-property name="serverEncoding"&ISO-8859-1&/connection-property&
&driver-class&com.alibaba.china.jdbc.SimpleDriver&/driver-class&
&min-pool-size&1&/min-pool-size&
&max-pool-size&14&/max-pool-size&
&prepared-statement-cache-size&20&/prepared-statement-cache-size&
&metadata&
&type-mapping&Oracle9i&/type-mapping&
&/metadata&
&idle-timeout-minutes&15&/idle-timeout-minutes&
&exception-sorter-class-name&org.jboss.resource.adapter.jdbc.vendor.OracleExceptionSorter&/exception-sorter-class-name&
&user-name&xx&/user-name&
&password&xx&/password&
&/local-tx-datasource&
其中prepared-statement-cache-size参数解释为:
&prepared-statement-cache-size& - the number of prepared statements per connection to be kept open and reused in subsequent requests. They are stored in a LRU cache. The default is 0 (zero), meaning no cache.
为每个打开的数据库连接缓存了一定数量的prepared statement.他们是存在LRU cache中,如果设值为0,那么将不缓冲。这里我们设值了每个连接缓存20条prepared statment。
而在c3p0的配置中:
&bean id="testDataSource"
class="org.springframework.beans.factory.config.MethodInvokingFactoryBean"&
&property name="staticMethod"&
&value&com.mchange.v2.c3p0.DataSources.pooledDataSource&/value&
&/property&
&property name="arguments"&
&ref local="unpooledDataSource" /&
&prop key="acquireIncrement"&1&/prop&
&prop key="initialPoolSize"&1&/prop&
&prop key="minPoolSize"&1&/prop&
&prop key="maxPoolSize"&5&/prop&
&prop key="maxIdleTime"&1800&/prop&
&prop key="maxIdleTimeExcessConnections"&1000&/prop&
&!-- 自动收缩连接用的,单位秒 --&
&!-- 自动重连需要的三个参数 --&
&prop key="acquireRetryAttempts"&30&/prop&
&prop key="acquireRetryDelay"&1000&/prop&
&prop key="breakAfterAcquireFailure"&false&/prop&
&!-- 获取一个connection需要的时间,单位毫秒 --&
&prop key="checkoutTimeout"&5000&/prop&
&/property&
上网查了下,影响到preparedStatment cache的参数有两个:maxStatements和maxStatementsPerConnection 如果maxStatements与maxStatementsPerConnection均为0,则缓存被关闭,默认为0。
继续实验:
1、将c3p0配置增加maxStatements和maxStatementsPerConnection并都设值20。
修改数据库表结构,刷新访问页面。
后台抛出违反协议和处于不一致状态的错误提示。
2.将oracle-ds.xml文件配置更改prepared-statement-cache-size为0。
修改数据库表结构,刷新访问页面。
后台没有抛出违反协议和处于不一致状态的错误提示。
附参考文章:
http://community.jboss.org/wiki/configdatasources&& 讲解jboss中关于datasource的参数
/blog/60387&& 讲解c3p0的详细参数
浏览 13044
论坛回复 /
(9 / 6345)
研究得够深入的。不错。
记得很早之前,就遇到过这样的问题。
ps cached确实存在一定的使用风险。
并且,我还有一个疑问,在我们这样杂和的应用中,ps cached,真的有性能提升吗?
楼上上次有做过对应测试吗?
从profile分析上看,理论上有20%的性能提升,也在一个应用上实施过
但在其他的几个应用实施时,会有莫名的close statement cache的错误。网上也有相应的bug报告
查了几天没查到原因,线下做过比较多的稳定性测试也没能重现线上的问题,比较诡异,后来没时间弄了就放弃了。
总之一句话,慎用ps cache!
stone2083 写道研究得够深入的。不错。
记得很早之前,就遇到过这样的问题。
ps cached确实存在一定的使用风险。
并且,我还有一个疑问,在我们这样杂和的应用中,ps cached,真的有性能提升吗?
楼上上次有做过对应测试吗?
同问,我公司的项目还算较小,如果数据库的压力过大的时候,都是做业务的切割,数据库分表。ps cache 是否对性能有提升,我们没做过实验,请楼主给予指点
我没有做过性能上的测试,有时间我会去做下。
研究得够深入的。不错。
记得很早之前,就遇到过这样的问题。
ps cached确实存在一定的使用风险。
并且,我还有一个疑问,在我们这样杂和的应用中,ps cached,真的有性能提升吗?
楼上上次有做过对应测试吗?
同问,我公司的项目还算较小,如果数据库的压力过大的时候,都是做业务的切割,数据库分表。ps cache 是否对性能有提升,我们没做过实验,请楼主给予指点
Willam2004
浏览: 47190 次
来自: 杭州
编译失败
E:\java\project\Test\src\c ...
恩,很不错的文章,受益不少!!
学习了不少知识。。。
&p&我想应该可以清除&span style ...
Willam2004 写道gogole_09 写道Nice,java.sql.SQLException: ORA-00604: 递归 SQL 级别 1 出现错误 - 推酷
java.sql.SQLException: ORA-00604: 递归 SQL 级别 1 出现错误
后台报出如下错误:
Caused by: java.sql.SQLException: ORA-00604: 递归 SQL 级别 1 出现错误
ORA-01000: 超出打开游标的最大数
ORA-00604: 递归 SQL 级别 1 出现错误
ORA-01000: 超出打开游标的最大数
ORA-01000: 超出打开游标的最大数
这个错误一般出现在利用代码循环执行数据库命令(例如将数据导入到数据库或者定时任务向数据库中插入数据)时,例如在java中
1.建立一个Connection
2.循环创建PreparedStatement,并执行数据导入
3.关闭OracleConnection
当第二步的循环数比较小时,代码运行正常。当循环数超过一定值(例如300),代码就会出错。提示:
ORA-01000:&超出打开游标的最大数
Oracle数据库中打开的游标最大数为一定值,默认情况下是300,当代码到第二步时,&循环中一个PreparedStatement占用了一个数据库游标,执行的循环超过这个数时就会产生游标数目溢出错误。
解决办法:
第二步循环中每次执行完PreparedStatement,都将PreparedStatement.close()下,释放掉这个资源就好了
此外,也可以修改数据库的最大游标数,不过这个方法治标不治本。(
alter system set open_cursors=1000 scope=
已发表评论数()
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
标题不准确
排版有问题
主题不准确
没有分页内容
图片无法显示
视频无法显示
与原文不一致近期经常登录WEB程序经常报错如下,重新启动TOMCAT就好,但过一段时间还那样。
Caused&by:&java.sql.SQLException:&Io&异常:&Software&caused&connection&abort:&recv&failed
Caused&by:&java.sql.SQLException:&OALL8&处于不一致状态
[&11:02:46&ERROR]&{org.hibernate.util.JDBCExceptionReporter:78}-无法从套接字读取更多的数据
以上资讯了DBA,没有发现连接数超出范围和锁表等情况。
数据库驱动ojdbc6.jar,数据库oracle10G
WEB&应用网段&10.78.
DB&应用网段&192.168.&
回答: 请大家帮忙一下错误:Caused by: java.sql.SQLException: OALL8 处于不一致状态 这个错误怎么解决呢
Q 近期发现web系统部署会有以下错误:
&&&&&1、&Caused&by:&java.sql.SQLException:&Io&异常:&Software&caused&connection&abort:&recv&failed
&&&&&2、Caused&by:&java.sql.SQLException:&OALL8&处于不一致状态
&&&&&3、[&11:02:46&ERROR]&{org.hibernate.util.JDBCExceptionReporter:78}-无法从套接字读取更多的数据
&&&&&&当时遇到该问题时,情况如下,登录该系统,会产生3个连接,开始时第一个连接即会产生以上3个问题,后来发现前2个连接通过,第三个连接产生“OALL8&处于不一致状态”问题;
&&&&&此过程中,监控数据库一直处于正常状态;
&&&&&数据库驱动ojdbc6.jar,数据库oracle10G
&&&&hibernate配置的数据类型与数据库一致,数据库类型均是varchar与char类型;(如果不一致是不是每次都应该出错啊?)
&&&&请求大师帮助解决问题,分析一下原因,谢谢
因为你运行的是oracle&10g,就可能面临这个问题,因为10g存在一个已知的bug,bug在oracle的编号为:Bug:5851267&
oracle已经推出补丁,解决这个问题。
或者不应用补丁,以下面这种方式解决
设置参数&"_optimizer_join_elimination_enabled"为false,如下:
SQL&&alter&session&set&“_optimizer_join_elimination_enabled”=
“_optimizer_join_elimination_enabled”这个参数oracle内部参数,如果你不能获得oracle技术支持,最好不要使用这个参数,否则可能会受到损失。
Q 在hibernate中调用存储过程,其中我的存储过程编写如下:
dao接口:
public List undoBusiness() {
List list = this.getSession().getNamedQuery("undobusiness").list();
我的表jz_business_plan定义如下:
CREATE TABLE jz_business_plan(
gp_id int(10) unsigned NOT NULL auto_increment,
g_id int(11) unsigned default NULL,
account_id int(11) unsigned default NULL,
bs_id int unsigned default null,
plandate timestamp NOT NULL default CURRENT_TIMESTAMP,
remark varchar(255) default NULL,
gb_id int unsigned default null,
index (gb_id),
FOREIGN KEY (gb_id) REFERENCES jz_guestbook (gb_id),
index (account_id),
FOREIGN KEY (account_id) REFERENCES account_table(account_id) ,
index (g_id),
FOREIGN KEY (g_id) REFERENCES jz_gbmes(g_id),
index (bs_id),
FOREIGN KEY (bs_id) REFERENCES jz_business(bs_id) ,
PRIMARY KEY
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
我调用的时候会出现java.sql.SQLException: Column 'gp_id' not found.错误,用这种方式调用其他的存储过程时没有错误,郁闷!难道我的存储过程有问题么?
错误信息如下:
08:33:13,382 WARN [org.hibernate.util.JDBCExceptionReporter] - SQL Error: 0, SQLState: S0022
08:33:13,382 ERROR [org.hibernate.util.JDBCExceptionReporter] - Column 'gp_id' not found.
org.hibernate.exception.SQLGrammarException: could not execute query
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:67)
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
at org.hibernate.loader.Loader.doList(Loader.java:2148)
at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2029)
at org.hibernate.loader.Loader.list(Loader.java:2024)
at org.hibernate.loader.custom.CustomLoader.list(CustomLoader.java:111)
at org.hibernate.impl.SessionImpl.listCustomQuery(SessionImpl.java:1655)
at org.hibernate.impl.AbstractSessionImpl.list(AbstractSessionImpl.java:142)
at org.hibernate.impl.SQLQueryImpl.list(SQLQueryImpl.java:164)
at cn.qdrk.strive.dao.hibernate.CRMDaoHibernate.undoBusiness(CRMDaoHibernate.java:43)
[color=red]at cn.qdrk.strive.dao.hibernate.CRMDaoHibernate$$FastClassByCGLIB$$afe1117e.invoke(&generated&)[/color] at net.sf.cglib.proxy.MethodProxy.invoke(MethodProxy.java:149)
[color=red]Caused by: java.sql.SQLException: Column 'gp_id' not found.[/color]
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1055)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:926)
at com.mysql.jdbc.ResultSetImpl.findColumn(ResultSetImpl.java:1093)
at com.mysql.jdbc.ResultSetImpl.getInt(ResultSetImpl.java:2734)
at org.apache.tomcat.dbcp.dbcp.DelegatingResultSet.getInt(DelegatingResultSet.java:237)
A 你的数据库中,有没有把gp_id设置为主键啊?
Q 在hibernate中调用存储过程,其中我的存储过程编写如下:
DELIMITER $$
DROP PROCEDURE IF EXISTS `qdrk`.`undobusiness`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `undobusiness`()
DECLARE business_date timestamp default current_
SELECT business_
SELECT max(plandate) into business_date from jz_business_
SELECT business_
set mon = DATE_FORMAT(business_date,'%m');
WHILE (mon & DATE_FORMAT(Now(),'%m')) do
insert into jz_business_plan(g_id,gb_id,account_id,bs_id) values(g_id,gb_id,account_id,bs_id);
select g_id ,gb_id,account_id,bs_id from jz_gbmes where ((stday & date_format(Now(),'%d') and enday & date_format(Now(),'%d') and remindtype= '2') ;
set mon = mon+1;
end WHILE;
SELECT * from jz_business_plan WHERE DATE_FORMAT(jz_business_plan.plandate,'%m') = DATE_FORMAT(now(),'%m');
DELIMITER ;
hibernate的配置文件如下:
hibernate-mapping&
&class name="cn.qdrk.strive.model.JzBusinessPlan" table="jz_business_plan" catalog="qdrk"&
&id name="gpId" type="java.lang.Integer"&
&column name="gp_id" /&
&generator class="native"&&/generator&
&many-to-one name="accountTable" class="cn.qdrk.strive.model.AccountTable" fetch="select"&
&column name="account_id" /&
&/many-to-one&
&many-to-one name="jzBusiness" class="cn.qdrk.strive.model.JzBusiness" fetch="select"&
&column name="bs_id" /&
&/many-to-one&
&many-to-one name="jzGuestbook" class="cn.qdrk.strive.model.JzGuestbook" fetch="select"&
&column name="gb_id" /&
&/many-to-one&
&many-to-one name="jzGbmes" class="cn.qdrk.strive.model.JzGbmes" fetch="select"&
&column name="g_id" /&
&/many-to-one&
&property name="plandate" type="java.util.Date"&
&column name="plandate" length="19" not-null="true" /&
&/property&
&property name="remark" type="java.lang.String"&
&column name="remark" /&
&/property&
&sql-query name="undobusiness" callable="true"&
&return alias="JzBusinessPlan" class="cn.qdrk.strive.model.JzBusinessPlan"&
&return-property name="gp_id" column="gp_id"/&
&return-property name="g_id" column="g_id" /&
&return-property name="account_id" column="account_id"/&
&return-property name="bs_id" column="bs_id" /&
&return-property name="plandate" column="plandate" /&
&return-property name="remark" column="remark" /&
&return-property name="gb_id" column="gb_id" /&
{call undobusiness()}
&/sql-query&
&/hibernate-mapping&
错误信息如下:
09:38:07,882 WARN [org.hibernate.util.JDBCExceptionReporter] - SQL Error: 0, SQLState: S0022
09:38:07,882 ERROR [org.hibernate.util.JDBCExceptionReporter] - Column 'gp_id' not found.
org.hibernate.exception.SQLGrammarException: could not execute query
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:67)
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
at org.hibernate.loader.Loader.doList(Loader.java:2148)
at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2029)
at org.hibernate.loader.Loader.list(Loader.java:2024)
at org.hibernate.loader.custom.CustomLoader.list(CustomLoader.java:111)
at org.hibernate.impl.SessionImpl.listCustomQuery(SessionImpl.java:1655)
at org.hibernate.impl.AbstractSessionImpl.list(AbstractSessionImpl.java:142)
at org.hibernate.impl.SQLQueryImpl.list(SQLQueryImpl.java:164)
at cn.qdrk.strive.dao.hibernate.CRMDaoHibernate.undoBusiness(CRMDaoHibernate.java:43)
at cn.qdrk.strive.dao.hibernate.CRMDaoHibernate$$FastClassByCGLIB$$afe1117e.invoke(&generated&)
at net.sf.cglib.proxy.MethodProxy.invoke(MethodProxy.java:149)
at org.springframework.aop.framework.Cglib2AopProxy$CglibMethodInvocation.invokeJoinpoint(Cglib2AopProxy.java:694)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:149)
Caused by: java.sql.SQLException: Column 'gp_id' not found.
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1055)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:926)
at com.mysql.jdbc.ResultSetImpl.findColumn(ResultSetImpl.java:1093)
at com.mysql.jdbc.ResultSetImpl.getInt(ResultSetImpl.java:2734)
at org.apache.tomcat.dbcp.dbcp.DelegatingResultSet.getInt(DelegatingResultSet.java:237)
at org.hibernate.type.IntegerType.get(IntegerType.java:28)
at org.hibernate.type.NullableType.nullSafeGet(NullableType.java:113)
at org.hibernate.type.NullableType.nullSafeGet(NullableType.java:102)
at org.hibernate.loader.Loader.getKeyFromResultSet(Loader.java:1088)
at org.hibernate.loader.Loader.getRowFromResultSet(Loader.java:554)
at org.hibernate.loader.Loader.doQuery(Loader.java:689)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:224)
at org.hibernate.loader.Loader.doList(Loader.java:2145)
问题补充:我的jz_business_plan表中有这个键值的映射啊,至于二楼说的return-property name="gp_id" column="gp_id"/&&&
你的属性名不是gpId吗,改成gpId一样也会出现这样的问题。
问题补充:我调用存储过程call undobusiness();除了gp_id为4,plandate为当前时间,其他的列值都是null,难道是这方面的原因,哪么调用存储过程select g_id ,gb_id,account_id,bs_id from jz_gbmes where ((stday & date_format(Now(),'%d') and enday & date_format(Now(),'%d') and remindtype= '2') ;会列出数据,这样怎么修改呢?问题补充:E文没看懂,如果返回的是null,该怎么修改呢?万分感谢!问题补充:name属性是用来关联column的,我不用程序调用存储过程,在mysql命令行中调用call undobusiness();,会列出jz_business_plan的表中的内容,这张表会显示出列为:gp_id,g_id,remark,bs_id,gb_id,plandate,account_id,都会显示出来。
A 如果你的引用
#&& &return-property name="gp_id" column="gp_id"/&&
#&&& &return-property name="g_id" column="g_id" /&&
#&&& &return-property name="account_id" column="account_id"/&&
#&&& &return-property name="bs_id" column="bs_id" /&&
#&&& &return-property name="plandate" column="plandate" /&&
#&&& &return-property name="remark" column="remark" /&&
#&&& &return-property name="gb_id" column="gb_id" /&&
配置的属性存储过程都返回了的话,不管是不是null因该都没关系的,英文的意思就是说数量一定要对上,没有值的返回NULL也要把数量对上
Q Exception&in&thread&"main"&org.apache.ibatis.exceptions.PersistenceException:&
###&Error&updating&database.&&Cause:&java.sql.SQLException:&Could&not&retrieve&transation&read-only&status&server
###&The&error&may&involve&zhao.ai.nan.dao.PersonDao.insert-Inline
###&The&error&occurred&while&setting&parameters
###&SQL:&insert&into&person(name,password)&values(?,?)
###&Cause:&java.sql.SQLException:&Could&not&retrieve&transation&read-only&status&server
at&org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:23)
at&org.apache.ibatis.session.defaults.DefaultSqlSession.update(DefaultSqlSession.java:147)
at&org.apache.ibatis.session.defaults.DefaultSqlSession.insert(DefaultSqlSession.java:134)
at&org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:79)
at&org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:40)
at&$Proxy0.insert(Unknown&Source)
at&zhao.ai.nan.test.Main.main(Main.java:37)
Caused&by:&java.sql.SQLException:&Could&not&retrieve&transation&read-only&status&server
at&com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1078)
at&com.mysql.jdbc.SQLError.createSQLException(SQLError.java:989)
at&com.mysql.jdbc.SQLError.createSQLException(SQLError.java:975)
at&com.mysql.jdbc.SQLError.createSQLException(SQLError.java:920)
at&com.mysql.jdbc.SQLError.createSQLException(SQLError.java:951)
at&com.mysql.jdbc.SQLError.createSQLException(SQLError.java:941)
at&com.mysql.jdbc.ConnectionImpl.isReadOnly(ConnectionImpl.java:3936)
at&com.mysql.jdbc.ConnectionImpl.isReadOnly(ConnectionImpl.java:3907)
at&com.mysql.jdbc.PreparedStatement.checkReadOnlySafeStatement(PreparedStatement.java:1258)
at&com.mysql.jdbc.PreparedStatement.execute(PreparedStatement.java:1278)
at&org.apache.ibatis.executor.statement.PreparedStatementHandler.update(PreparedStatementHandler.java:41)
at&org.apache.ibatis.executor.statement.RoutingStatementHandler.update(RoutingStatementHandler.java:66)
at&org.apache.ibatis.executor.SimpleExecutor.doUpdate(SimpleExecutor.java:45)
at&org.apache.ibatis.executor.BaseExecutor.update(BaseExecutor.java:108)
at&org.apache.ibatis.executor.CachingExecutor.update(CachingExecutor.java:75)
at&org.apache.ibatis.session.defaults.DefaultSqlSession.update(DefaultSqlSession.java:145)
...&5&more
Caused&by:&java.sql.SQLException:&Unknown&system&variable&'tx_read_only'
at&com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1078)
at&com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4120)
at&com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4052)
at&com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2503)
at&com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2664)
at&com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2809)
at&com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2758)
at&com.mysql.jdbc.StatementImpl.executeQuery(StatementImpl.java:1612)
at&com.mysql.jdbc.ConnectionImpl.isReadOnly(ConnectionImpl.java:3930)
...&14&more
应该是mysql数据库和你使用的数据库的驱动包的版本存在问题。换个驱动包版本试下
Q 使用SpringMVC、Hibernate,现在tomcat启动报错。报错信息如下,请大家帮忙看看。谢谢!
[color=blue]org.hibernate.connection.ConnectionProviderFactory.initializeConnectionProviderFromConfig(ConnectionProviderFactory.java:173) [INFO] - Initializing connection provider: org.springframework.orm.hibernate3.TransactionAwareDataSourceConnectionProvider
16:20:18.933 [main] org.hibernate.cfg.SettingsFactory.buildSettings(SettingsFactory.java:140) [WARN] - Could not obtain connection metadata
java.sql.SQLException: Io exception: The Network Adapter could not establish the connection
&&&&&&& at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:125)
&&&&&&& at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:162)
&&&&&&& at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:274)
&&&&&&& at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:328)
&&&&&&& at oracle.jdbc.driver.PhysicalConnection.&init&(PhysicalConnection.java:361)
&&&&&&& at oracle.jdbc.driver.T4CConnection.&init&(T4CConnection.java:151)
&&&&&&& at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:32)
&&&&&&& at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:595)
&&&&&&& at java.sql.DriverManager.getConnection(DriverManager.java:582)
&&&&&&& at java.sql.DriverManager.getConnection(DriverManager.java:154)
&&&&&&& at org.springframework.jdbc.datasource.DriverManagerDataSource.getConnectionFromDriverManager(DriverManagerDataSource.java:174)
&&&&&&& at org.springframework.jdbc.datasource.DriverManagerDataSource.getConnectionFromDriver(DriverManagerDataSource.java:165)
&&&&&&& at org.springframework.jdbc.datasource.AbstractDriverBasedDataSource.getConnectionFromDriver(AbstractDriverBasedDataSource.java:149)
&&&&&&& at org.springframework.jdbc.datasource.AbstractDriverBasedDataSource.getConnection(AbstractDriverBasedDataSource.java:119)
&&&&&&& at org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSourceUtils.java:113)
&&&&&&& at org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy$TransactionAwareInvocationHandler.invoke(TransactionAwareDataSourceProxy.java:210)
&&&&&&& at $Proxy19.getMetaData(Unknown Source)
&&&&&&& at org.hibernate.cfg.SettingsFactory.buildSettings(SettingsFactory.java:116)
&&&&&&& at org.hibernate.cfg.Configuration.buildSettingsInternal(Configuration.java:2833)
&&&&&&& at org.hibernate.cfg.Configuration.buildSettings(Configuration.java:2829)
&&&&&&& at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1840)
&&&&&&& at org.springframework.orm.hibernate3.LocalSessionFactoryBean.newSessionFactory(LocalSessionFactoryBean.java:814)
&&&&&&& at org.springframework.orm.hibernate3.LocalSessionFactoryBean.buildSessionFactory(LocalSessionFactoryBean.java:732)
&&&&&&& at org.springframework.orm.hibernate3.AbstractSessionFactoryBean.afterPropertiesSet(AbstractSessionFactoryBean.java:211)
&&&&&&& at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1368)
&&&&&&& at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1334)
&&&&&&& at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:473)
&&&&&&& at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory$1.run(AbstractAutowireCapableBeanFactory.java:409)
&&&&&&& at java.security.AccessController.doPrivileged(Native Method)
&&&&&&& at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:380)
&&&&&&& at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:264)
&&&&&&& at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:221)
&&&&&&& at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:261)
&&&&&&& at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:185)
&&&&&&& at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:164)
&&&&&&& at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:269)
&&&&&&& at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:104)
&&&&&&& at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1245)
&&&&&&& at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1010)
&&&&&&& at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:472)
&&&&&&& at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory$1.run(AbstractAutowireCapableBeanFactory.java:409)
&&&&&&& at java.security.AccessController.doPrivileged(Native Method)
&&&&&&& at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:380)
&&&&&&& at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:264)
&&&&&&& at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:221)
&&&&&&& at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:261)
&&&&&&& at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:185)
&&&&&&& at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:164)
&&&&&&& at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:269)
&&&&&&& at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:104)
&&&&&&& at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1245)
&&&&&&& at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1010)
&&&&&&& at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:472)
&&&&&&& at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory$1.run(AbstractAutowireCapableBeanFactory.java:409)
&&&&&&& at java.security.AccessController.doPrivileged(Native Method)
&&&&&&& at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:380)
&&&&&&& at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:264)
&&&&&&& at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:221)
&&&&&&& at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:261)
&&&&&&& at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:185)
&&&&&&& at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:164)
&&&&&&& at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:429)
&&&&&&& at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:729)
&&&&&&& at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:381)
&&&&&&& at org.springframework.web.context.ContextLoader.createWebApplicationContext(ContextLoader.java:255)
&&&&&&& at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:199)
&&&&&&& at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:45)
&&&&&&& at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4172)
&&&&&&& at org.apache.catalina.core.StandardContext.start(StandardContext.java:4671)
&&&&&&& at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:799)
&&&&&&& at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:779)
&&&&&&& at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:546)
&&&&&&& at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:1041)
&&&&&&& at org.apache.catalina.startup.HostConfig.deployDirectories(HostConfig.java:964)
&&&&&&& at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:502)
&&&&&&& at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1277)
&&&&&&& at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:321)
&&&&&&& at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:142)
&&&&&&& at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1061)
&&&&&&& at org.apache.catalina.core.StandardHost.start(StandardHost.java:785)
&&&&&&& at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1053)
&&&&&&& at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:463)
&&&&&&& at org.apache.catalina.core.StandardService.start(StandardService.java:525)
&&&&&&& at org.apache.catalina.core.StandardServer.start(StandardServer.java:701)
&&&&&&& at org.apache.catalina.startup.Catalina.start(Catalina.java:585)
&&&&&&& at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
&&&&&&& at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
&&&&&&& at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
&&&&&&& at java.lang.reflect.Method.invoke(Method.java:597)
&&&&&&& at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:289)
&&&&&&& at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:414)[/color]
A The Network Adapter could not establish the connection 要么应用里的url等写错了 要么数据库没开
Q 运行StuDialog.class出现下面错误提示,初学Java请求帮助找出下面是什么原因?
java.sql.SQLException: No value specified for parameter 2
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1075)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:989)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:984)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:929)
at com.mysql.jdbc.PreparedStatement.checkAllParametersSet(PreparedStatement.java:2560)
at com.mysql.jdbc.PreparedStatement.fillSendPacket(PreparedStatement.java:2536)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2383)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2327)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2312)
at com.studentmanager.StuAddDialog.actionPerformed(StuAddDialog.java:109)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
at ponent.processMouseEvent(Component.java:6216)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3265)
at ponent.processEvent(Component.java:5981)
at java.awt.Container.processEvent(Container.java:2041)
at ponent.dispatchEventImpl(Component.java:4583)
at java.awt.Container.dispatchEventImpl(Container.java:2099)
at ponent.dispatchEvent(Component.java:4413)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4556)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4220)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4150)
at java.awt.Container.dispatchEventImpl(Container.java:2085)
at java.awt.Window.dispatchEventImpl(Window.java:2475)
at ponent.dispatchEvent(Component.java:4413)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:178)
at java.awt.Dialog$1.run(Dialog.java:1051)
at java.awt.Dialog$3.run(Dialog.java:1103)
at java.security.AccessController.doPrivileged(Native Method)
at java.awt.Dialog.show(Dialog.java:1101)
at ponent.show(Component.java:1516)
at ponent.setVisible(Component.java:1468)
at java.awt.Window.setVisible(Window.java:841)
at java.awt.Dialog.setVisible(Dialog.java:991)
at com.studentmanager.StuAddDialog.&init&(StuAddDialog.java:73)
at com.studentmanager.StuDialog.actionPerformed(StuDialog.java:109)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
at ponent.processMouseEvent(Component.java:6216)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3265)
at ponent.processEvent(Component.java:5981)
at java.awt.Container.processEvent(Container.java:2041)
at ponent.dispatchEventImpl(Component.java:4583)
at java.awt.Container.dispatchEventImpl(Container.java:2099)
at ponent.dispatchEvent(Component.java:4413)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4556)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4220)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4150)
at java.awt.Container.dispatchEventImpl(Container.java:2085)
at java.awt.Window.dispatchEventImpl(Window.java:2475)
at ponent.dispatchEvent(Component.java:4413)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
1、StuDialog.class如下:
package com.
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.sql.C
import java.sql.DriverM
import java.sql.PreparedS
import java.sql.ResultS
import java.util.V
public class StuDialog extends JFrame implements ActionListener{
//定义一些控件
JPanel jp1,jp2;
JLabel jl1;
JButton jb1,jb2,jb3,jb4;
public static void main(String[] args) {
// TODO Auto-generated method stub
StuDialog stuDialog=new StuDialog();
public StuDialog()
jp1=new JPanel();
jtf=new JTextField(10);
jb1=new JButton("查询");
jb1.addActionListener(this);
jl1=new JLabel("请输入名字");
//把各个控件加入到jp1
jp1.add(jl1);
jp1.add(jtf);
jp1.add(jb1);
jp2=new JPanel();
jb2=new JButton("添加");
jb2.addActionListener(this);
jb3=new JButton("修改");
jb4=new JButton("删除");
//把各个按钮就加入到jp2
jp2.add(jb2);
jp2.add(jb3);
jp2.add(jb4);
/*//rowData可以存放多行
Vector hang=new Vector();
hang.add("sp001");
hang.add("孙悟空");
hang.add("男");
hang.add("25");
hang.add("火锅山");
hang.add("少林派");
//加入到rowData
rowData.add(hang);*/
//创建一个数据模型对象
StuModel sm=new StuModel();
//初始化JTable
jt=new JTable(sm);
//初始化Jsp JScrollPane
jsp=new JScrollPane(jt);
//把jsp放入JFrame
this.add(jsp);
this.add(jp1,"North");
this.add(jp2,"South");
&&& this.setSize(400,300);
&&& this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
&&& this.setVisible(true);
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
//判断是哪个按钮被点击
if(e.getSource()==jb1)
System.out.println("用户想查询");
//因为把表的现实的数据封装到StuModel中,那么我们就可以
//简单完成查询
//查询数据库,更新JTable
String name=this.jtf.getText().trim();
//写一个SQL语句
String sql="select * from stu where stuName='"+name+"'";
//构建新的数据模型,并更新
StuModel sm=new StuModel(sql);
//更新JTable
jt.setModel(sm);
//当用户点击添加
else if(e.getSource()==jb2)
StuAddDialog sa=new StuAddDialog(this,"添加学生",true);
//重新再获得新的数据模型
2、StuAddDialog.class如下:
package com.
import java.awt.*;
import javax.swing.*;
import java.util.*;
import java.awt.event.*;
import javax.swing.JD
import java.sql.*;
public class StuAddDialog extends JDialog implements ActionListener {
&&& //定义我需要的swing控件
JPanel jp1,jp2,jp3;
JTextField jtf1,jtf2,jtf3,jtf4,jtf5,jtf6;
JButton jb1,jb2;
JLabel jl1,jl2,jl3,jl4,jl5,jl6;
//owner 它的父窗口
//title窗口名
//model指定是模式窗口,还是非模式窗口
public StuAddDialog(Frame owner,String title,boolean modal)
super(owner,title,modal);//调用父类构造方法,达到模式对话框效果
jl1=new JLabel("学号");
jl2=new JLabel("姓名");
jl3=new JLabel("性别");
jl4=new JLabel("年龄");
jl5=new JLabel("籍贯");
jl6=new JLabel("系别");
jtf1=new JTextField();
jtf2=new JTextField();
jtf3=new JTextField();
jtf4=new JTextField();
jtf5=new JTextField();
jtf6=new JTextField();
jb1=new JButton("添加");
jb1.addActionListener(this);
jb2=new JButton("取消");
jp1=new JPanel();
jp2=new JPanel();
jp3=new JPanel();
//设置布局
&&& jp1.setLayout(new GridLayout(6,1));
jp2.setLayout(new GridLayout(6,1));
jp1.add(jl1);
jp1.add(jl2);
jp1.add(jl3);
jp1.add(jl4);
jp1.add(jl5);
jp1.add(jl6);
jp2.add(jtf1);
jp2.add(jtf2);
jp2.add(jtf3);
jp2.add(jtf4);
jp2.add(jtf5);
jp2.add(jtf6);
jp3.add(jb1);
jp3.add(jb2);
this.add(jp1,BorderLayout.WEST);
this.add(jp2,BorderLayout.CENTER);
this.add(jp3,BorderLayout.SOUTH);
jb1.addActionListener(this);
this.setSize(300,250);
//this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
public void actionPerformed(ActionEvent e)
if(e.getSource()==jb1)
//对用户点击添加按钮后的响应动作
//连接数据库
Connection ct=
Statement stmt=
ResultSet rs=
PreparedStatement psmt=
//连接数据库,判断用户是否合法
//1加载驱动
Class.forName("com.mysql.jdbc.Driver");
//2创建连接对象,注册驱动程序并打开连接对象
ct=DriverManager.getConnection("jdbc:mysql://localhost:3306/student?useUnicode=true&characterEncoding=GBK","root","123456");
psmt=ct.prepareStatement("select * from stu");
//3获取语句对象
//stmt=ct.createStatement();
//与编译语句对象
psmt=ct.prepareStatement("insert into stu values(?,?,?,?,?,?)");
//给参数赋值
psmt.setString(1,jtf1.getText());
psmt.setString(1,jtf2.getText());
psmt.setString(1,jtf3.getText());
psmt.setString(1,jtf4.getText());
psmt.setString(1,jtf5.getText());
psmt.setString(1,jtf6.getText());
//4执行操作
psmt.executeUpdate();
this.dispose();//关闭对话框
}catch(ClassNotFoundException e1)
e1.printStackTrace();
}catch(SQLException e2)
e2.printStackTrace();
//释放语句对象,连接对象
if(rs!=null) rs.close();
if(stmt!=null) stmt.close();
if(ct!=null) ct.close();
}catch(Exception e2)
e2.printStackTrace();
public Container getContentPane() {
// TODO Auto-generated method stub
return super.getContentPane();
public void setContentPane(Container contentPane) {
// TODO Auto-generated method stub
super.setContentPane(contentPane);
问题补充:fxmabo 写道
//与编译语句对象
psmt=ct.prepareStatement("insert into stu values(?,?,?,?,?,?)");
//给参数赋值
psmt.setString(1,jtf1.getText());
psmt.setString(1,jtf2.getText());
psmt.setString(1,jtf3.getText());
psmt.setString(1,jtf4.getText());
psmt.setString(1,jtf5.getText());
psmt.setString(1,jtf6.getText());
很明显的,你在考验我的视力,下标全是1,那后面的全都为空了,所以他会说第二个参数没有值呀!
正解,粗心啊,已经将下表改成了1~6了
//与编译语句对象
psmt=ct.prepareStatement("insert into stu values(?,?,?,?,?,?)");
//给参数赋值
psmt.setString(1,jtf1.getText());
psmt.setString(1,jtf2.getText());
psmt.setString(1,jtf3.getText());
psmt.setString(1,jtf4.getText());
psmt.setString(1,jtf5.getText());
psmt.setString(1,jtf6.getText());
很明显的,你在考验我的视力,下标全是1,那后面的全都为空了,所以他会说第二个参数没有值呀!
Q SSH程序 tomcat
proxool连接池
配置如下:
&proxool-config&
& &proxool&
&&& &alias&DBPool&/alias&
&&& &driver-url&jdbc:oracle:thin:@(description=(address_list=
&&& (address=(host=*****)(protocol=tcp)(port=1521))
&&& (address=(host=*****)(protocol=tcp)(port=1521))
&&& (load_balance=yes))
&&& (connect_data=(server=dedicated)(service_name=ORCL)))
&/driver-url&
&&& &driver-class&oracle.jdbc.driver.OracleDriver&/driver-class&
&&& &driver-properties&
&&&&& &property name="user" value="****"/&
&&&&& &property name="password" value="****"/&
&&& &/driver-properties&&
&&& &house-keeping-sleep-time&90000&/house-keeping-sleep-time&
&maximum-new-connections&20&/maximum-new-connections&
&prototype-count&15&/prototype-count&
&maximum-connection-count&80&/maximum-connection-count&
&minimum-connection-count&10&/minimum-connection-count&
&&& &house-keeping-test-sql&select 1 from dual&/house-keeping-test-sql&
&&& &maximum-active-time&1200000&/maximum-active-time&
&&&
&&& &trace&true&/trace&
&verbose&true&/verbose&
& &/proxool&
&/proxool-config&
上线运行一周左右 orcle数据库就倒& 大家帮分析下啊
日志信息如下:
[ERROR] 21 七月 11:16:43.338 下午 HouseKeeper [org.logicalcobwebs.proxool.DBPool]
#0048 encountered errors during destruction:
java.sql.SQLException: Io 异常: Broken pipe
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112)
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:146)
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:255)
at oracle.jdbc.driver.T4CConnection.logoff(T4CConnection.java:481)
at oracle.jdbc.driver.PhysicalConnection.close(PhysicalConnection.java:1228)
at org.logicalcobwebs.proxool.ProxyConnection.reallyClose(ProxyConnection.java:192)
at org.logicalcobwebs.proxool.ConnectionPool.removeProxyConnection(ConnectionPool.java:423)
at org.logicalcobwebs.proxool.HouseKeeper.sweep(HouseKeeper.java:90)
at org.logicalcobwebs.proxool.HouseKeeperThread.run(HouseKeeperThread.java:39)
[ERROR] 21 七月 11:16:43.347 下午 HouseKeeper [org.logicalcobwebs.proxool.DBPool]
#0050 encountered errors during destruction:
java.sql.SQLException: 无法从套接字读取更多的数据
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112)
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:146)
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:208)
at oracle.jdbc.driver.T4CMAREngine.unmarshalUB1(T4CMAREngine.java:1123)
at oracle.jdbc.driver.T4CMAREngine.unmarshalSB1(T4CMAREngine.java:1075)
at oracle.jdbc.driver.T4C7Ocommoncall.receive(T4C7Ocommoncall.java:106)
at oracle.jdbc.driver.T4CConnection.logoff(T4CConnection.java:465)
at oracle.jdbc.driver.PhysicalConnection.close(PhysicalConnection.java:1228)
at org.logicalcobwebs.proxool.ProxyConnection.reallyClose(ProxyConnection.java:192)
at org.logicalcobwebs.proxool.ConnectionPool.removeProxyConnection(ConnectionPool.java:423)
at org.logicalcobwebs.proxool.HouseKeeper.sweep(HouseKeeper.java:90)
at org.logicalcobwebs.proxool.HouseKeeperThread.run(HouseKeeperThread.java:39)
[ERROR] 21 七月 11:16:43.358 下午 HouseKeeper [org.logicalcobwebs.proxool.DBPool]
问题补充:数据库的这个实例的down了,然后导致socket通信中断,现在不知道为什么会down
cn-done 写道原因:1.可能是数据库端的socket通信中断了 2.检查你的数据库服务器是不是down了
问题补充:之前清查了一遍 把没有关掉的连接都关了,从原来的3天一down变成了现在一周一down
cn-done 写道你们数据库好像是做了RAC。检查一下数据库日志呢,是否连接被占完了又不释放
A 以上提供的日志只能得出一个结论:数据库访问不起,挂掉了!
还是分析下更多的日志吧!以前出现过类似的问题都是链接不释放,JDBC 代码不关闭链接,还有隐藏的很深的配置问题。建议你让公司DBA监控下数据库的使用情况,具体问题具体分析
Q 请各位帮忙,我看了两天也看出怎么错了。
plsql代码:
SQL& create or replace package testpackage as
--创建包用来放游标
type test_
--定义的游标test_cursor,ref curosr用法还不是很熟
Package created
SQL& create or replace procedure fenye(
v_tablename in varchar2,
--输入的表名,根据不同的表来分页
in number,
--分页时当前页码
v_pagesize
in number,
--每页的页数
v_mypagecount out number,
--计算出一共多少页
out number,
--计算表中一共多少行
p_cursor out testpackage.test_cursor
--要输出的游标
varchar2(1000); 11
v_begin number:=(v_pagenow-1)*v_pagesize+1;
--计算初始页,既从哪页开始 12
number:=v_pagenow*v_
--计算结束页,既从哪页结束
v_sql:='select * 15
(select b.*, 16
rownum as rn 17
(select * 18
from '||v_tablename||' 19
order by sal desc) b 20
where rownum&='||v_end||') 21
open p_cursor for v_
v_sql:='select count(*) from '||v_ 24
execute immediate v_sql into v_
if mod(v_myrows,v_pagesize)=0 then 26
v_mypagecount:=v_myrows/v_ 27
v_mypagecount:=v_myrows/v_pagesize+1; 29
close p_ 31 32
Procedure created
import java.sql.*;
public class TestProcedure{
public static void main(String args[]){
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection con = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:MYORACLE","SCOTT","TIGER");
CallableStatement call=con.prepareCall("{call fenye(?,?,?,?,?,?)}");--分页过程的6个参数
call.setString(1,"emp");
call.setInt(2,3);
call.setInt(3,2);
call.registerOutParameter(4,oracle.jdbc.OracleTypes.INTEGER);
call.registerOutParameter(5,oracle.jdbc.OracleTypes.INTEGER);
call.registerOutParameter(6,oracle.jdbc.OracleTypes.CURSOR);--输出的游标
call.execute();
int rowNum=call.getInt(4);
int pageCount=call.getInt(5);
//System.out.println("rowNum:"+rowNum);
//System.out.println("pageCount:"+pageCount);
ResultSet rs=(ResultSet) ((OracleCallableStatement)call).getObject(6);
--提示有错误
while(rs.next()){
System.out.println("编号:"+rs.getInt(1)+" "+"名字:"+rs.getString(2));
rs.close();
con.close();
call.close();
catch(Exception e){
e.printStackTrace();
错误Exception:
rowNum:7pageCount:14
java.sql.SQLException: Ref 游标无效 at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:180) at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:222) at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:285) at oracle.jdbc.driver.OracleStatement.getCursorValue(OracleStatement.java:3211) at oracle.jdbc.driver.OracleStatement.getObjectValue(OracleStatement.java:5036) at oracle.jdbc.driver.OracleStatement.getObjectValue(OracleStatement.java:4964) at oracle.jdbc.driver.OracleCallableStatement.getObject(OracleCallableStatement.java:586) at com.neusoft.TestProcedure.main(TestProcedure.java:26)
问题补充:好用了,谢谢,但是不关闭游标这样好吗,如果多次调用这个存储过程得的话,会不会有什么异常。。。或是其他的问题。。。
A 这个要分情况讨论的啦,你这里游标是当作输出参数的,所以不能手动关闭它,只要open一下就可以了,否则调用以后拿不到结果,oralce会自己进行管理的。
第2种情况就是游标并不是当作输出参数的,只是个普通的游标,比如,在有些情况下,需要打开游标,然后,遍历游标,根据具体业务需求更新业务表等等,在这种情况下的话,当游标用完后需要手动关闭,不然会占用资源。
还有一种情况是隐试游标,也不需要手动关闭,例如:
for rec_item in select * from tablename loop
这种简化的遍历方式oralce其实是隐式地申明了一个游标,不用管,oracle也会自己管理。
Q 这是项目在启动的时候出现的错误,哪位高人可以给讲解一下啊?遇到过好多次了!!java.sql.SQLException: An attempt by a client to checkout a Connection has timed out.
at com.mchange.v2.sql.SqlUtils.toSQLException(SqlUtils.java:106)
at com.mchange.v2.sql.SqlUtils.toSQLException(SqlUtils.java:65)
at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool.checkoutPooledConnection(C3P0PooledConnectionPool.java:527)
at com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource.getConnection(AbstractPoolBackedDataSource.java:128)
at mon.ConnectionFactory.getConnection(ConnectionFactory.java:42)
.jdlh.supervise.ServiceDao.init(ServiceDao.java:102)
.jdlh.supervise.servlet.Data2XMLServlet.init(Data2XMLServlet.java:60)
at javax.servlet.GenericServlet.init(GenericServlet.java:212)
at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1173)
at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:993)
at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:4420)
at org.apache.catalina.core.StandardContext.start(StandardContext.java:4733)
at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:799)
at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:779)
at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:601)
at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:943)
at org.apache.catalina.startup.HostConfig.deployWARs(HostConfig.java:778)
at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:504)
at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1315)
at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:324)
at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:142)
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1061)
at org.apache.catalina.core.StandardHost.start(StandardHost.java:840)
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1053)
at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:463)
at org.apache.catalina.core.StandardService.start(StandardService.java:525)
at org.apache.catalina.core.StandardServer.start(StandardServer.java:754)
at org.apache.catalina.startup.Catalina.start(Catalina.java:595)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:289)
at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:414)
Caused by: com.mchange.v2.resourcepool.TimeoutException: A client timed out while waiting to acquire a resource from
-- timeout at awaitAvailable()
at com.mchange.v2.resourcepool.BasicResourcePool.awaitAvailable(BasicResourcePool.java:1317)
at com.mchange.v2.resourcepool.BasicResourcePool.prelimCheckoutResource(BasicResourcePool.java:557)
at com.mchange.v2.resourcepool.BasicResourcePool.checkoutResource(BasicResourcePool.java:477)
at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool.checkoutPooledConnection(C3P0PooledConnectionPool.java:525)
... 31 more
A 你配置的连接池的请求超时了,你可以将timeout的值设置高一些.设置成10000ms吧.

我要回帖

更多关于 java.sql.resultset 的文章

 

随机推荐