Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 已使用SQL Azure关闭连接_Java_Sql Server_Azure_Persistence_Database Connection - Fatal编程技术网

Java 已使用SQL Azure关闭连接

Java 已使用SQL Azure关闭连接,java,sql-server,azure,persistence,database-connection,Java,Sql Server,Azure,Persistence,Database Connection,我有一个Java服务器,它使用Quartz作为调度器连续运行作业。 这个程序的目标是定期执行计算,因此每T分钟一个作业开始:它获取数据进行验证,进行一些计算并将其保存回数据库 服务器是从Microsoft Azure中的VM运行的,带有Ubuntu12.04 LTS,而数据库是SQL Azure。 我使用的ORM是Ebean 3.3.1-RC2 我一直得到以下例外情况: javax.persistence.PersistenceException: com.microsoft.sqlserver

我有一个Java服务器,它使用Quartz作为调度器连续运行作业。 这个程序的目标是定期执行计算,因此每T分钟一个作业开始:它获取数据进行验证,进行一些计算并将其保存回数据库

服务器是从Microsoft Azure中的VM运行的,带有Ubuntu12.04 LTS,而数据库是SQL Azure。 我使用的ORM是Ebean 3.3.1-RC2

我一直得到以下例外情况:

javax.persistence.PersistenceException: com.microsoft.sqlserver.jdbc.SQLServerException: The connection is closed.
at com.avaje.ebeaninternal.server.transaction.JdbcTransaction.rollback(JdbcTransaction.java:642)
at com.avaje.ebeaninternal.server.transaction.JdbcTransaction.rollback(JdbcTransaction.java:623)
at com.avaje.ebeaninternal.server.core.BeanRequest.rollbackTransIfRequired(BeanRequest.java:87)
at com.avaje.ebeaninternal.server.core.DefaultServer.findId(DefaultServer.java:1241)
at com.avaje.ebeaninternal.server.core.DefaultServer.findUnique(DefaultServer.java:1253)
at com.avaje.ebeaninternal.server.querydefn.DefaultOrmQuery.findUnique(DefaultOrmQuery.java:908)
at com.avaje.ebeaninternal.util.DefaultExpressionList.findUnique(DefaultExpressionList.java:189)
at com.db.DAO.findById(ItemDAO.java:89)
at com.jobs.Task.doTask(ItemTask.java:50)
at com.jobs.Job.execute(ItemJob.java:34)
at org.quartz.core.JobRunShell.run(JobRunShell.java:213)
at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:557)
Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: The connection is closed.
at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDriverError(SQLServerException.java:190)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.checkClosed(SQLServerConnection.java:388)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.rollback(SQLServerConnection.java:1954)
at com.avaje.ebeaninternal.server.lib.sql.PooledConnection.rollback(PooledConnection.java:794)
at com.avaje.ebeaninternal.server.transaction.JdbcTransaction.rollback(JdbcTransaction.java:635)
... 11 more
这是我的ebean.conf:

datasource.azuresql.username=username
datasource.azuresql.password=password
datasource.azuresql.databaseUrl=jdbc:sqlserver://server_name.database.windows.net:1433;database=database_name;user=user_name@server_name;password=password;encrypt=true;hostNameInCertificate=*.database.windows.net;loginTimeout=30;
datasource.azuresql.databaseDriver=com.microsoft.sqlserver.jdbc.SQLServerDriver
datasource.azuresql.minConnections=1
datasource.azuresql.maxConnections=400
datasource.azuresql.isolationlevel=read_committed
datasource.azuresql.capturestacktrace=true
datasource.azuresql.maxInactiveTimeSecs=30
我不知道该怎么办,我试着改变超时值,最小/最大连接数,但这个异常不断出现。 我注意到的一件事是,系统在一段时间内运行良好,然后我得到了大约30-40个像这样的异常,然后一切都继续,因为没有任何问题


请建议一个修复方案,谢谢。

正如上面的一条评论所述,来自Peter的连接池将帮助您获得已打开的连接。这就是它的主要功能。连接池还可以帮助您自动删除已关闭的连接;但是连接池可能很难处理断开的连接。在.NET世界中,请查看这篇文章,其中解释了需要对.NET库进行更新才能处理此特定情况。如果Ebean没有在内部实现类似的逻辑来自动为您重新打开断开的连接,那么实现它的负担就在您身上


此外,添加针对Azure SQL数据库的连接重试是一种已知且强烈推荐的模式。下面是显示此模式的早期实现的示例。这是微软最近发布的一份报告

连接关闭是您应该处理的事情,无论这是您的代码还是SQL Azure的问题(例如,路由器死亡,连接将关闭)。我认为这是连接池必须处理的事情。Ebean应该会处理它,但有些地方出了问题..连接池将重用未使用的连接对象,这样就不必花费任何费用重新创建另一个连接对象--这与无法连接到服务器的连接对象没有任何关系。我不知道您是否使用过Ebean,但它使连接处理变得透明,因此从技术上讲,我必须只编写Ebean.find(Entity.class).findList()来创建连接,创建连接池,并为其中一个连接分配执行指令的负担。我真的无法控制引擎盖下发生的事情,是连接池重用还是连接关闭检查。嗯,听起来没那么有用。我怀疑您必须捕获异常并运行
Ebean.find(…
进程。请记住,在数据库上执行的任何操作都可能发生这种情况……最好使用包装Ebean的方法。我对Ebean不熟悉,您可能已经知道了