GVKun编程网logo

获取java.sql.SQLException:ResultSet关闭后不允许进行操作(关闭的resultset)

34

本文将介绍获取java.sql.SQLException:ResultSet关闭后不允许进行操作的详细情况,特别是关于关闭的resultset的相关信息。我们将通过案例分析、数据研究等多种方式,帮助您

本文将介绍获取java.sql.SQLException:ResultSet关闭后不允许进行操作的详细情况,特别是关于关闭的resultset的相关信息。我们将通过案例分析、数据研究等多种方式,帮助您更全面地了解这个主题,同时也将涉及一些关于Caused by: org.hibernate.exception.SQLGrammarException: could not extract ResultSet、com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException:连接关闭后不允许进行任何操作、Exception in thread “main” java.sql.SQLException: No suitable driver、Java JDBC MySQL异常:“ResultSet关闭后不允许操作”的知识。

本文目录一览:

获取java.sql.SQLException:ResultSet关闭后不允许进行操作(关闭的resultset)

获取java.sql.SQLException:ResultSet关闭后不允许进行操作(关闭的resultset)

获取java.sql.SQLException:ResultSet关闭后不允许进行操作当我执行以下代码时,出现异常。我认为这是因为我正在与他相同的连接对象编写新语句。我应该如何重写它,以便可以创建准备好的语句并开始使用rs2?即使连接到相同的数据库,我也必须创建一个新的连接对象吗?

    try     {        //Get some stuff        String name = "";        String sql = "SELECT `name` FROM `user` WHERE `id` = " + userId + " LIMIT 1;";        ResultSet rs = statement.executeQuery(sql);        if(rs.next())        {            name = rs.getString("name");        }        String sql2 = "SELECT `id` FROM  `profiles` WHERE `id` =" + profId + ";";        ResultSet rs2 = statement.executeQuery(sql2);        String updateSql = "INSERT INTO `blah`............";         PreparedStatement pst = (PreparedStatement)connection.prepareStatement(updateSql);            while(rs2.next())         {             int id = rs2.getInt("id");            int stuff = getStuff(id);            pst.setInt(1, stuff);            pst.addBatch();        }        pst.executeBatch();    }     catch (Exception e)     {        e.printStackTrace();    }private int getStuff(int id){    try    {               String sql = "SELECT ......;";            ResultSet rs = statement.executeQuery(sql);            if(rs.next())            {                return rs.getInt("something");            }            return -1;    }//code continues

答案1

小编典典

问题在于你在中获取数据的方式getStuff()。每次访问getStuff()你都会获得新鲜的食物,ResultSet但你不会关闭它。

这违反了Statement该类的期望(请参见此处-http : //docs.oracle.com/javase/7/docs/api/java/sql/Statement.html):

默认情况下,每个Statement对象只能同时打开一个ResultSet对象。因此,如果一个ResultSet对象的读取与另一个的读取交错,则每个都必须由不同的Statement对象生成。如果存在打开的语句,Statement接口中的所有执行方法都会隐式关闭该语句的当前ResultSet对象。

更糟糕的是rs调用代码中的。它也从statement字段外派生,但未关闭。

底线:你有多个ResultSet与同一个Statement对象同时打开。

Caused by: org.hibernate.exception.SQLGrammarException: could not extract ResultSet

Caused by: org.hibernate.exception.SQLGrammarException: could not extract ResultSet

org.springframework.dao.InvalidDataAccessResourceUsageException: could not extract ResultSet; SQL [n/a]; nested exception is org.hibernate.exception.SQLGrammarException: could not extract ResultSet

    at org.springframework.orm.jpa.vendor.HibernateJpaDialect.convertHibernateAccessException(HibernateJpaDialect.java:281)
    at org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible(HibernateJpaDialect.java:255)
    at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.translateExceptionIfPossible(AbstractEntityManagerFactoryBean.java:528)
    at org.springframework.dao.support.ChainedPersistenceExceptionTranslator.translateExceptionIfPossible(ChainedPersistenceExceptionTranslator.java:61)
    at org.springframework.dao.support.DataAccessUtils.translateIfNecessary(DataAccessUtils.java:242)
    at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:153)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
    at org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor$CrudMethodMetadataPopulatingMethodInterceptor.invoke(CrudMethodMetadataPostProcessor.java:178)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
    at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:93)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:212)
    at com.sun.proxy.$Proxy91.save(Unknown Source)
    at com.qingmu.seller.reposity.ProductCategoryReposityTest.saveTest(ProductCategoryReposityTest.java:32)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
    at org.springframework.test.context.junit4.statements.RunBeforeTestExecutionCallbacks.evaluate(RunBeforeTestExecutionCallbacks.java:74)
    at org.springframework.test.context.junit4.statements.RunAfterTestExecutionCallbacks.evaluate(RunAfterTestExecutionCallbacks.java:84)
    at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:75)
    at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:86)
    at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:84)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:251)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:97)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
    at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
    at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:190)
    at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
    at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
    at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:33)
    at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:230)
    at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:58)
Caused by: org.hibernate.exception.SQLGrammarException: could not extract ResultSet
    at org.hibernate.exception.internal.SQLExceptionTypeDelegate.convert(SQLExceptionTypeDelegate.java:63)
    at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:42)
    at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:113)
    at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:99)
    at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract(ResultSetReturnImpl.java:67)
    at org.hibernate.id.enhanced.SequenceStructure$1.getNextValue(SequenceStructure.java:95)
    at org.hibernate.id.enhanced.NoopOptimizer.generate(NoopOptimizer.java:40)
    at org.hibernate.id.enhanced.SequenceStyleGenerator.generate(SequenceStyleGenerator.java:520)
    at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:120)
    at org.hibernate.event.internal.DefaultPersistEventListener.entityIsTransient(DefaultPersistEventListener.java:192)
    at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:135)
    at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:62)
    at org.hibernate.event.service.internal.EventListenerGroupImpl.fireEventOnEachListener(EventListenerGroupImpl.java:108)
    at org.hibernate.internal.SessionImpl.firePersist(SessionImpl.java:702)
    at org.hibernate.internal.SessionImpl.persist(SessionImpl.java:688)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:314)
    at com.sun.proxy.$Proxy86.persist(Unknown Source)
    at org.springframework.data.jpa.repository.support.SimpleJpaRepository.save(SimpleJpaRepository.java:554)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.springframework.data.repository.core.support.RepositoryComposition$RepositoryFragments.invoke(RepositoryComposition.java:371)
    at org.springframework.data.repository.core.support.RepositoryComposition.invoke(RepositoryComposition.java:204)
    at org.springframework.data.repository.core.support.RepositoryFactorySupport$ImplementationMethodExecutionInterceptor.invoke(RepositoryFactorySupport.java:657)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
    at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.doInvoke(RepositoryFactorySupport.java:621)
    at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.invoke(RepositoryFactorySupport.java:605)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
    at org.springframework.data.projection.DefaultMethodInvokingMethodInterceptor.invoke(DefaultMethodInvokingMethodInterceptor.java:80)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
    at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:366)
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:99)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
    at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:139)
    ... 38 more
Caused by: java.sql.SQLSyntaxErrorException: FUNCTION seller.nextval does not exist
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:120)
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:97)
    at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122)
    at com.mysql.cj.jdbc.ClientPreparedStatement.executeInternal(ClientPreparedStatement.java:953)
    at com.mysql.cj.jdbc.ClientPreparedStatement.executeQuery(ClientPreparedStatement.java:1003)
    at com.zaxxer.hikari.pool.ProxyPreparedStatement.executeQuery(ProxyPreparedStatement.java:52)
    at com.zaxxer.hikari.pool.HikariProxyPreparedStatement.executeQuery(HikariProxyPreparedStatement.java)
    at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract(ResultSetReturnImpl.java:57)
    ... 72 more

使用 springDataJPA 时候,因为数据库方言设置不正确,报错为上面的信息.

修改一下数据库中配置的方言

  jpa:
    hibernate:
      ddl-auto: create
    database-platform: org.hibernate.dialect.MySQL5InnoDBDialect
    show-sql: true

解决这个问题,

还有一种就是数据库中的字段和实体类中的名称对应不上,也会报这个错误

com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException:连接关闭后不允许进行任何操作

com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException:连接关闭后不允许进行任何操作

我构建了一个应用程序,并在本地部署了……并且运行良好。我将其部署在远程服务器上,并开始获取主题行中提到的异常。这不是因为防火墙问题。

我更改了hibernate.xml通过IP地址而不是本地主机进行连接的方式,现在我在本地部署的应用程序上获得了相同的超时。当我使应用程序运行超过一天时,出现此错误。

我自己提交事务或关闭会话之后,我不执行任何操作。我正在使用以下属性hibernate.cfg.xml

<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>        <property name="hibernate.connection.url">jdbc:mysql://myremotehost:3306/akp</property>        <property name="hibernate.connection.username">root</property>        <property name="hibernate.connection.password">root</property>        <property name="hibernate.show_sql">false</property>        <property name="hibernate.current_session_context_class">thread</property>        <property name="hibernate.query.factory_class">org.hibernate.hql.ast.ASTQueryTranslatorFactory</property>

引起原因:com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException:连接关闭后不允许进行任何操作。驱动程序暗中关闭了连接。

详细:

 Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: No operations allowed after connection closed.Connection was implicitly closed by the driver.      at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)      at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)      at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)      at java.lang.reflect.Constructor.newInstance(Constructor.java:513)      at com.mysql.jdbc.Util.handleNewInstance(Util.java:409)      at com.mysql.jdbc.Util.getInstance(Util.java:384)      at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1015)      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.ConnectionImpl.throwConnectionClosedException(ConnectionImpl.java:1193)      at com.mysql.jdbc.ConnectionImpl.checkClosed(ConnectionImpl.java:1180)      at com.mysql.jdbc.ConnectionImpl.prepareStatement(ConnectionImpl.java:4137)      at com.mysql.jdbc.ConnectionImpl.prepareStatement(ConnectionImpl.java:4103)      at org.hibernate.jdbc.AbstractBatcher.getPreparedStatement(AbstractBatcher.java:505)      at org.hibernate.jdbc.AbstractBatcher.getPreparedStatement(AbstractBatcher.java:423)      at org.hibernate.jdbc.AbstractBatcher.prepareQueryStatement(AbstractBatcher.java:139)      at org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:1547)      at org.hibernate.loader.Loader.doQuery(Loader.java:673)      at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:236)      at org.hibernate.loader.Loader.doList(Loader.java:2220)      ... 36 moreCaused by: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: The last packet successfully received from the server was 34,247,052 milliseconds ago.  The last packet sent successfully to the server was 34,247,052 milliseconds ago. is longer than the server configured value of ''wait_timeout''. You should consider either expiring and/or testing connection validity before use in your application, increasing the server configured values for client timeouts, or using the Connector/J connection property ''autoReconnect=true'' to avoid this problem.      at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)      at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)      at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)      at java.lang.reflect.Constructor.newInstance(Constructor.java:513)      at com.mysql.jdbc.Util.handleNewInstance(Util.java:409)      at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1118)      at com.mysql.jdbc.MysqlIO.send(MysqlIO.java:3321)      at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1940)      at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2113)      at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2568)      at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2113)      at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:2275)      at org.hibernate.jdbc.AbstractBatcher.getResultSet(AbstractBatcher.java:186)      at org.hibernate.loader.Loader.getResultSet(Loader.java:1787)      at org.hibernate.loader.Loader.doQuery(Loader.java:674)      at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:236)      at org.hibernate.loader.Loader.doList(Loader.java:2220)      at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2104)      at org.hibernate.loader.Loader.list(Loader.java:2099)      at org.hibernate.loader.criteria.CriteriaLoader.list(CriteriaLoader.java:94)      at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1569)      at org.hibernate.impl.CriteriaImpl.list(CriteriaImpl.java:283)      at com.xyz.abc.DAO.GenericHibernateDAO.findByField(GenericHibernateDAO.java:119)      at com.xyz.abc.DAO.JobDAO.getJobsByLdap(JobDAO.java:115)      at com.xyz.abc.business.Jcr.getMyruns(Jcr.java:272)      at com.xyz.abc.business.abcService.getMyruns(abcService.java:54)      at sun.reflect.GeneratedMethodAccessor139.invoke(Unknown Source)      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)      at java.lang.reflect.Method.invoke(Method.java:597)      at org.apache.axis2.rpc.receivers.RPCUtil.invokeServiceClass(RPCUtil.java:194)      at org.apache.axis2.rpc.receivers.RPCMessageReceiver.invokeBusinessLogic(RPCMessageReceiver.java:102)      at org.apache.axis2.receivers.AbstractInOutMessageReceiver.invokeBusinessLogic(AbstractInOutMessageReceiver.java:40)      at org.apache.axis2.receivers.AbstractMessageReceiver.receive(AbstractMessageReceiver.java:114)      at org.apache.axis2.engine.AxisEngine.receive(AxisEngine.java:173)      at org.apache.axis2.transport.http.HTTPTransportUtils.processHTTPPostRequest(HTTPTransportUtils.java:173)      at org.apache.axis2.transport.http.AxisServlet.doPost(AxisServlet.java:142)      at javax.servlet.http.HttpServlet.service(HttpServlet.java:641)      at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)      at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304)      at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)      at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:240)      at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:203)      at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164)      at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:108)      at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)      at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:379)      at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:242)      at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:259)      at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:237)      ... 4 moreCaused by: java.net.SocketException: Software caused connection abort: socket write error

有谁知道什么可能导致此行为?

编辑:现在在我的hibernate.cfg.xml文件中使用了folloing,对吗?

<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>    <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>    <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/xyz</property>    <property name="hibernate.connection.username">root</property>    <property name="hibernate.connection.password">root</property>    <property name="hibernate.show_sql">false</property>    <property name="hibernate.current_session_context_class">thread</property>    <property name="hibernate.query.factory_class">org.hibernate.hql.ast.ASTQueryTranslatorFactory</property>    <property name="hibernate.c3p0.min_size">5</property>    <property name="hibernate.c3p0.max_size">20</property><!-- <property name="hibernate.c3p0.max_size">1800</property>-->    <property name="hibernate.c3p0.max_statements">50</property>    <property name="connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>    <property name="c3p0.max_statements">0</property>    <property name="c3p0.maxIdleTimeExcessConnections">3600</property>    <property name="c3p0.idleConnectionTestPeriod">3600</property>     <property name="c3p0.maxIdleTime">3600</property>

答案1

小编典典

正如@swanliu指出的,这是由于连接不良所致。
但是,在调整服务器时间和客户端超时之前,我将首先尝试并使用更好的连接池策略。

连接池

Hibernate本身承认其连接池策略很少

但是,Hibernate自己的连接池算法非常初级。它旨在帮助您入门,不适合在生产系统中使用,甚至不用于性能测试。您应该使用第三方池来获得最佳性能和稳定性。只需将hibernate.connection.pool_size属性替换为连接池特定的设置即可。这将关闭Hibernate的内部池。例如,您可能想使用c3p0。
如参考资料中所述
:http :
//docs.jboss.org/hibernate/core/3.3/reference/en/html/session-
configuration.html

我个人使用C3P0。但是,还有其他选择DBCP
查看

  • http://www.mchange.com/projects/c3p0/index.html
  • http://commons.apache.org/dbcp/

以下是我的应用程序中使用的C3P0的最低配置:

<property name="connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property><property name="c3p0.acquire_increment">1</property> <property name="c3p0.idle_test_period">100</property> <!-- seconds --> <property name="c3p0.max_size">100</property> <property name="c3p0.max_statements">0</property> <property name="c3p0.min_size">10</property> <property name="c3p0.timeout">1800</property> <!-- seconds -->

默认情况下,池永远不会使连接失效。如果您希望连接随着时间过期以保持“新鲜”,请设置maxIdleTime和/或maxConnectionAge。maxIdleTime定义在从池中剔除连接之前,应允许连接闲置多少秒。maxConnectionAge强制池取消从数据库获取的所有连接,而超过过去设置的秒数。
如参考资料中所述: http
:
//www.mchange.com/projects/c3p0/index.html#managing_pool_size

编辑:
我更新了配置文件(参考),因为我刚才为项目复制并粘贴了该文件。超时应该理想地解决该问题,如果对您不起作用,那么有一个
昂贵的解决方案 ,我想您可以看一下:

创建一个文件“
c3p0.properties”,该文件必须位于类路径的根目录中(即无法对应用程序的特定部分覆盖它)。(参考)

# c3p0.propertiesc3p0.testConnectionOnCheckout=true

使用此配置,每个连接在使用前都经过测试。但是,这可能会影响网站的性能。

Exception in thread “main” java.sql.SQLException: No suitable driver

Exception in thread “main” java.sql.SQLException: No suitable driver

问题背景:通过Spark SQL的jdbc去读取Oracle数据做测试,在本地的idea中没有报任务错误。但是打包到集群的时候报:

 Exception in thread “main” java.sql.SQLException: No suitable driver

测试代码:

def read(spark: SparkSession): DataFrame = {
  val jdbcDF = spark.read
    .format("jdbc")
    .option("url""jdbc:oracle:thin:@ip:1521:orcl")
    .option("dbtable""SPARTA.BAYONET_VEHICLEPASS10")
    .option("user""SPARTA")
    .option("password""hik12345")
    .load()

  jdbcDF
} 

在本地测试通过,服务器会报如上截图的错误。最后通过排查发现是少了一句要制定driver的类型

   .option("driver""oracle.jdbc.driver.OracleDriver")

 

Java JDBC MySQL异常:“ResultSet关闭后不允许操作”

Java JDBC MySQL异常:“ResultSet关闭后不允许操作”

我已经在这方面工作了将近一天半,我似乎无法解决这个错误.我不知道为什么要关闭ResultSet.也许你们中的一些人可以帮助我.

MySQLDatabase:

package net.gielinor.network.sql;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.sqlException;
import java.sql.Statement;

public abstract class MysqLDatabase {

    private String host;
    private String database;
    private String username;
    private String password;
    private Connection connection = null;
    private Statement statement;

    public MysqLDatabase(String host,String database,String username,String password) {
        this.host = host;
        this.database = database;
        this.username = username;
        this.password = password;
    }

    public abstract void cycle() throws sqlException;

    public abstract void ping();

    public void connect() {
        try {
            Class.forName("com.MysqL.jdbc.Driver").newInstance();
            connection = DriverManager.getConnection(String.format("jdbc:MysqL://%s/%s",host,database),username,password);
            statement = connection.createStatement();
        } catch (Exception e) {
            e.printstacktrace();
        }
    }

    public void ping(String table,String variable) {
        try {
            statement.executeQuery(String.format("SELECT * FROM `%s` WHERE `%s` = 'null'",table,variable));
        } catch (Exception e) {
            connect();
        }
    }

    public ResultSet query(String query) throws sqlException {
        if (query.toLowerCase().startsWith("select")) {
            return statement.executeQuery(query);
        } else {
            statement.executeUpdate(query);
        }
        return null;
    }

    public Connection getConnection() {
        return connection;
    }

}

MysqLHandler

package net.gielinor.network.sql;

import java.io.FileInputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;

import net.gielinor.network.sql.impl.MysqLDonation;

public class MysqLHandler extends Thread {

    private static final MysqLHandler MysqLHandler = new MysqLHandler();

    public static MysqLHandler getMysqLHandler() {
        return MysqLHandler;
    }

    private static List<MysqLDatabase> updateList;
    private static String host;
    private static String database;
    private static String username;
    private static String password;

    @Override
    public void run() {
        while (true) {
            for (MysqLDatabase database : updateList) {
                try {
                    if (database.getConnection() == null) {
                        database.connect();
                    } else {
                        database.ping();
                    }
                    database.cycle();
                } catch (Exception ex) {
                    ex.printstacktrace();
                }

                try {
                    Thread.sleep(10000);
                } catch (Exception ex) {
                }
            }
        }
    }

    private static void loadProperties() {
        Properties p = new Properties();
        try {
            p.load(new FileInputStream("./sql.ini"));
            host = p.getProperty("host");
            database = p.getProperty("database");
            username = p.getProperty("username");
            password = p.getProperty("password");   
        } catch (Exception ex) {
            System.out.println("Error loading MysqL properties.");
        }
    }

    public static String getHost() {
        return host;
    }

    static {
        loadProperties();
        updateList = new ArrayList<MysqLDatabase>();
        updateList.add(new MysqLDonation(host,database,password));
    }

}

MysqLDonation

package net.gielinor.network.sql.impl;

import java.sql.ResultSet;
import java.sql.sqlException;

import net.gielinor.game.model.player.Client;
import net.gielinor.game.model.player.PlayerHandler;
import net.gielinor.game.model.player.PlayerSave;
import net.gielinor.network.sql.MysqLDatabase;

public final class MysqLDonation extends MysqLDatabase {

    public MysqLDonation(String host,String password) {
        super(host,password);
    }

    @Override
    public void cycle() throws sqlException {
        ResultSet results = query("SELECT * FROM `gieli436_purchases`.`donations`");
        if (results == null) {
            return;
        }
        while (results.next()) {
            String username = results.getString("username").replace("_"," ");
            System.out.println("name=" + username);
            Client client = (Client) PlayerHandler.getPlayer(username.toLowerCase());
            System.out.println(client == null);
            if (client != null && !client.disconnected) {
                int creditamount = results.getInt("creditamount");
                if (creditamount <= 0) {
                    continue;
                }
                handleDonation(client,creditamount);
                query(String.format("DELETE FROM `gieli436_purchases`.`donations` WHERE `donations`.`username`='%s' LIMIT 1",client.playerName.replaceAll(" ","_")));
            }
        }
    }

    @Override
    public void ping() {
        super.ping("donations","username");
    }

    private void handleDonation(Client client,int creditamount) throws sqlException {
        client.credits = (client.credits + creditamount);
        client.sendMessage("Thank you for your purchase. You have received " + creditamount + " store credits.");
        PlayerSave.save(client);
    }

}

这里发生异常:在MysqLDonation中的while循环中,实际的堆栈跟踪是这样的:

java.sql.sqlException: Operation not allowed after ResultSet closed
    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.checkClosed(ResultSetImpl.java:794)
    at com.MysqL.jdbc.ResultSetImpl.next(ResultSetImpl.java:7077)
    at net.gielinor.network.sql.impl.MysqLDonation.cycle(UnkNown Source)
    at net.gielinor.network.sql.MysqLHandler.run(UnkNown Source)

有了这些信息,让我说这确实有用,我得到了我的信息以及游戏中的内容,但它重复了,就像用户永远不会从查询中删除一样,因此它给了他们无限的奖励.如果您需要更多信息,请随时询问.

最佳答案
运行“删除”查询时,将使用“选择”查询中使用的相同“语句”.当您在同一个Statement上重新执行时,前一个ResultSet将关闭.

为避免这种情况,您应该在每次执行查询时创建一个新的Statement.所以删除statement = connection.createStatement();从MysqLDatabase类中的connect()方法,并将该类中的所有语句替换为connection.createStatement().您也可以选择完全删除私有变量语句.

你可以阅读更多关于它here.

关于获取java.sql.SQLException:ResultSet关闭后不允许进行操作关闭的resultset的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于Caused by: org.hibernate.exception.SQLGrammarException: could not extract ResultSet、com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException:连接关闭后不允许进行任何操作、Exception in thread “main” java.sql.SQLException: No suitable driver、Java JDBC MySQL异常:“ResultSet关闭后不允许操作”等相关知识的信息别忘了在本站进行查找喔。

本文标签: