grails tomcat jndi的最佳mysql数据源属性

Posted

技术标签:

【中文标题】grails tomcat jndi的最佳mysql数据源属性【英文标题】:best mysql datasource properties for grails tomcat jndi 【发布时间】:2014-05-28 12:43:46 【问题描述】:

JNDI、mysql 5.6 和 tomcat 7 的大多数示例都在 DataSource.groovy 中定义:

dataSource 
   pooled = true
   driverClassName = "com.mysql.jdbc.Driver"
   dialect = 'org.hibernate.dialect.MySQL5InnoDBDialect'

environments:
   production 
        dataSource 
        dbCreate = "update"
        jndiName = "java:comp/env/myDatasourceName
    

在tomcat的conf/context.xml中:

<Context>
   <WatchedResource>WEB-INF/web.xml</WatchedResource>
      <Resource name="myDatasourceName" auth="Container" type="javax.sql.DataSource"
       maxActive="100" maxIdle="30" maxWait="10000"
       username="root" password="password" driverClassName="com.mysql.jdbc.Driver"
       url="jdbc:mysql://localhost:3306/my_db_name"/>
 </Context> 

问题是,对于基本的小批量生产系统来说,这是正确的设置吗?如果数据库出现故障然后又恢复等情况,它应该重新连接?

DataSource.xml 中有一个非常复杂的例子:

    dataSource 
        dbCreate = "update"
        //url = "jdbc:h2:prodDb;MVCC=TRUE;LOCK_TIMEOUT=10099;DB_CLOSE_ON_EXIT=FALSE"
        properties 
           // Documentation for Tomcat JDBC Pool
           // http://tomcat.apache.org/tomcat-7.0-doc/jdbc-pool.html#Common_Attributes
           // https://tomcat.apache.org/tomcat-7.0-doc/api/org/apache/tomcat/jdbc/pool/PoolConfiguration.html
           jmxEnabled = true
           initialSize = 5
           maxActive = 50
           minIdle = 5
           maxIdle = 25
           maxWait = 10000
           maxAge = 10 * 60000
           timeBetweenEvictionRunsMillis = 5000
           minEvictableIdleTimeMillis = 60000
           validationQuery = "SELECT 1"
           validationQueryTimeout = 3
           validationInterval = 15000
           testOnBorrow = true
           testWhileIdle = true
           testOnReturn = false
           ignoreExceptionOnPreLoad = true
           // http://tomcat.apache.org/tomcat-7.0-doc/jdbc-pool.html#JDBC_interceptors
           jdbcInterceptors = "ConnectionState;StatementCache(max=200)"
           defaultTransactionIsolation = java.sql.Connection.TRANSACTION_READ_COMMITTED // safe default
           // controls for leaked connections 
           abandonWhenPercentageFull = 100 // settings are active only when pool is full
           removeAbandonedTimeout = 120000
           removeAbandoned = true
           // use JMX console to change this setting at runtime
           logAbandoned = false // causes stacktrace recording overhead, use only for debugging
           /*
           // JDBC driver properties
           // Mysql as example
           dbProperties 
               // Mysql specific driver properties
               // http://dev.mysql.com/doc/connector-j/en/connector-j-reference-configuration-properties.html
               // let Tomcat JDBC Pool handle reconnecting
               autoReconnect=false
               // truncation behaviour 
               jdbcCompliantTruncation=false
               // mysql 0-date conversion
               zeroDateTimeBehavior='convertToNull'
               // Tomcat JDBC Pool's StatementCache is used instead, so disable mysql driver's cache
               cachePrepStmts=false
               cacheCallableStmts=false
               // Tomcat JDBC Pool's StatementFinalizer keeps track
               dontTrackOpenResources=true
               // performance optimization: reduce number of SQLExceptions thrown in mysql driver code
               holdResultsOpenOverStatementClose=true
               // enable MySQL query cache - using server prep stmts will disable query caching
               useServerPrepStmts=false
               // metadata caching
               cacheServerConfiguration=true
               cacheResultSetMetadata=true
               metadataCacheSize=100
               // timeouts for TCP/IP
               connectTimeout=15000
               socketTimeout=120000
               // timer tuning (disable)
               maintainTimeStats=false
               enableQueryTimeouts=false
               // misc tuning
               noDatetimeStringSync=true
           
           */
        
    

现在我不知道其中 95% 的参数是做什么的,但我想我都需要它们?

我不明白的是这个

    tomcat 肯定会汇集连接,所以 grails 数据源中的 pooled=true 应该是吗? tomcat 肯定会处理连接的重新连接和验证,那么为什么要定义validationQuery = "SELECT 1"?特别是它在 mysql dbPrperties 部分中的说法“autoREconnect=false。 有人能想出一个适用于少数用户的 mysql 的通用默认数据源定义吗?我可以调整最小/最大活动/空闲等,但这不是全部在 tomcat 中完成的,而不是在 grails 中完成的吗? "userServerPrepStmts=false" 为什么有人要禁用准备好的语句?在过去的 15 年里,我们一直在训练只使用准备好的语句,否则数据库无法缓存它们。 如果我忽略所有这些复杂的示例,并使用每个人发布的超级微笑,它会正常工作吗?例如当数据库下降和上升时它会重新连接吗?它不会泄漏等。

谢谢!

【问题讨论】:

【参考方案1】:

AFAIK,Tomcat 与管理数据库连接无关。由于Grails 2.3.6,这些是推荐的默认数据源属性:

properties 
  //see http://grails.org/doc/latest/guide/conf.html#dataSource for documentation
   jmxEnabled = true
   initialSize = 5
   maxActive = 50
   minIdle = 5
   maxIdle = 25
   maxWait = 10000
   maxAge = 10 * 60000
   timeBetweenEvictionRunsMillis = 5000
   minEvictableIdleTimeMillis = 60000
   validationQuery = "SELECT 1"
   validationQueryTimeout = 3
   validationInterval = 15000
   testOnBorrow = true
   testWhileIdle = true
   testOnReturn = false
   jdbcInterceptors = "ConnectionState;StatementCache(max=200)"
   defaultTransactionIsolation = java.sql.Connection.TRANSACTION_READ_COMMITTED

【讨论】:

我读过其他帖子说,当你使用 JNDI 和 tomcats 数据库资源时,你在此处放置的属性将被忽略,因为 tomcat 正在管理连接池。在这种情况下,我仍然不清楚该怎么做。我怀疑上面的答案是如果你使用的是 Grails 内部连接池,而不是 tomcats。

以上是关于grails tomcat jndi的最佳mysql数据源属性的主要内容,如果未能解决你的问题,请参考以下文章

使用 Tomcat 部署 grails 应用程序的最佳实践

在 Tomcat 中调用 JNDI 数据源的正确方法

为啥使用 JBoss 进行 Grails 部署?

如何使用 Spring 测试模拟的 JNDI 数据源?

怎样配置tomcat的jndi数据库连接?

Tomcat配置JNDI