java - JNDI 数据源模式

标签 java tomcat azure jndi

我在 Tomcat8 中使用 JNDI 资源连接到 MS-SQL 数据库 (Azure)。我随机遇到 Connection closed 异常,最终发生 Connection peer reset 事件。发生这种情况时,服务已死(运行到 Connection closed for every request)并且重新启动 tomcat (redploying) 是重新启动它的唯一机会。

在我尝试解决这个问题的过程中,我双重(三次)检查了每个未关闭连接的方法,我确保每个连接都以 try-with-ressource 打开。

目前我正试图更好地了解 JNDI 资源和连接池,我想问的是实现注入(inject)到其他服务的服务类的首选模式是什么。例如。问题是

  1. 调用ctx.lookup()应该把DataSource分配到哪里?在方法级别或类范围?例如。使用 hk2 @Service 注释时,服务似乎只实例化一次,而不是按请求实例化。目前 ctx.lookup() 被调用一次(在构造函数中)并且 DataSource 存储在类字段中,稍后由使用 this 的方法访问。数据源。这有意义吗?或者应该在每次请求(=方法调用)时检索 DataSource

  2. 如何验证数据源的多个选项的执行情况,例如testOnBorrowremoveAbandoned(请参阅下面的完整配置)是否正确执行?有一个选项 logAbandoned 但我在日志中看不到任何内容。无论如何,这应该出现在哪里?我能以某种方式为池指定特定的日志级别吗?我只找到了 org.apache.tomcat.jdbc.pool,但是这个类似乎只在创建池时被调用(至少这是日志出现的唯一时刻,即使在级别 最好的).

  3. 是否存在我不知道的一般模式?

这是我当前的配置:

<Resource name="jdbc/mssql"
          auth="Container"
          type="javax.sql.XADataSource"
          driverClassName="com.microsoft.sqlserver.jdbc.SQLServerDriver"
          username="***"
          password="***"
          url="jdbc:sqlserver://***.database.windows.net:1433;database=***;encrypt=true;trustServerCertificate=false;hostNameInCertificate=*.database.windows.net;loginTimeout=30;"
          factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
          removeAbandonedOnBorrow="true"
          removeAbandonedTimeout="55"
          removeAbandonedOnMaintenance="true"
          timeBetweenEvictionRunsMillis="34000"
          minEvictableIdleTimeMillis="55000"
          logAbandoned="true"
          validationQuery="SELECT 1"
          validationInterval="34000"
        />

谢谢,gapvision

最佳答案

Gapvision,您可以查看此链接 - What is the good design pattern for connection pooling?

您可能希望使用对象池模式。 希望这有帮助!!

关于java - JNDI 数据源模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31762138/

相关文章:

tomcat - 如何在不重新安装 Tomcat 的情况下安装 Tomcat Manager?

azure - VSTS - Docker/容器工作

java - 堆积条形图 : Changing appearance of entire bar?

java - 创建时数据存储写入过多

java - 如何让 tomcat 看到 maven jar 而不是共享/lib 中的 jar ?

tomcat - 只在本地运行 Tomcat 是否可行?

java - 为 Android 应用程序使用 Jsoup 解析表

javascript - 将 JS RegExp 对象转换为 Java 中的 Pattern 对象

powershell - 使用 Azure Power Shell 将应用程序设置添加到现有 Azure Web 应用程序

sql-server - 为什么我的 Azure SQL 数据库表永久锁定?