gpt4 book ai didi

java - 使用 SQL Azure 关闭连接

转载 作者:太空宇宙 更新时间:2023-11-04 06:59:21 25 4
gpt4 key购买 nike

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

服务器从 Microsoft Azure 中使用 Ubuntu 12.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 世界中,请查看 this blog post这说明需要更新 .NET 库来处理这种特定情况。如果 Ebean 没有在内部实现类似的逻辑来自动为您重新打开断开的连接,那么实现它的负担就落在您身上。

此外,添加针对 Azure SQL 数据库的连接重试是一种已知且强烈推荐的模式。这是an older blog显示了此模式的早期实现。这是更新的 best practice document来自微软。

关于java - 使用 SQL Azure 关闭连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22331749/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com