一尘不染

Grails的最佳mysql数据源属性

tomcat

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%是做什么的,但是我想我都需要它们吗?

我不明白的是

  1. 肯定是tomcat将合并连接,所以应该在grails数据源中使用pooled = true吗?
  2. 当然,tomcat将处理重新连接和连接验证,那么为什么要定义validateQuery =“ SELECT 1”?特别是在mysql dbPrperties部分中,它的说法是“ autoREconnect = false”。
  3. 有人能为少数用户提供适合mysql的通用默认数据源定义吗?我可以调整最小/最大活动/空闲等,但这不是全部在tomcat中完成,不是grails吗?
  4. “ userServerPrepStmts = false”为什么有人要禁用准备好的语句?在过去的15年中,我们一直只使用准备好的语句,否则数据库无法缓存它们。
  5. 如果我不理会所有这些复杂的示例,而与每个人都张贴的超级示例一起使用,它将正常运行吗?例如,当数据库崩溃时它将重新连接吗?它不会泄漏等吗

谢谢!


阅读 292

收藏
2020-06-16

共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
}
2020-06-16