对于使用tomcat数据库资源通过JNDI的Grails,应该pooled = true或pooled = false

Joh*_*tle 2 grails jndi connection-pooling

当您使用Grails管理MySQL连接时,您需要(为了处理重新连接)DataSource.groovy中的属性部分:

dataSource {
    pooled = true
    driverClassName = "com.mysql.jdbc.Driver"
    dialect = "org.hibernate.dialect.MySQL5InnoDBDialect"
    properties {
        maxActive = -1
        minEvictableIdleTimeMillis=1800000
        timeBetweenEvictionRunsMillis=1800000
        numTestsPerEvictionRun=3
        testOnBorrow=true
        testWhileIdle=true
        testOnReturn=true
        validationQuery="SELECT 1"
    }

environments {
    production{
        dataSource {
            dbCreate = "upate"
            url = "jdbc:mysql://127.0.0.1:3306/mydb"
            username = "myuser"
            password = "mypass"
        }

    }
Run Code Online (Sandbox Code Playgroud)

当您切换到使用Tomcat的连接池时,大多数示例都给出了:

production {
    dataSource {
        dbCreate = "update"
        jndiName = "java:comp/env/revolve"
    }
Run Code Online (Sandbox Code Playgroud)

问题1

对于这种类型的连接(即使用tomcat),应该在DataSource.grovvy中pooled = true或false,还是重要?有帖子说它必须是假的,帖子说它必须是真的,而有些则没有指明它.如果设置为True,则表示存在池池,但这是大多数示例推荐的.

问题2

属性部分是否被忽略?如果不是,建议的字段是什么.根据我的反复试验,属性似乎被忽略了,与此类帖子相反.

例如,使用JNDI时,DataSource.java属性中的validationQuery ="SELECT 1"似乎被忽略.即如果我重新启动数据库,Tomcat上的应用程序已永久失去与数据库的连接.如果我在Tomcat context.xml中添加相同的行:

<Resource name="revolve" auth="Container" type="javax.sql.DataSource"
    maxActive="50" maxIdle="5" maxWait="10000"
    username="myuser" password="mypass" driverClassName="com.mysql.jdbc.Driver"
    validationquery="SELECT 1;"
    url="jdbc:mysql://127.0.0.1:3306/mydb"/>
Run Code Online (Sandbox Code Playgroud)

并重新启动Tomcat,现在如果我重新启动数据库,Tomcat上的应用程序将继续运行.

这意味着在使用Tomcat的连接池时,DataSource.groovy中的dataSource的属性部分将被忽略.

Bur*_*ith 5

您不希望池化JNDI DataSource,因为它是服务器上的连接池,因此您将池化池连接.这不是什么大问题,您的本地DataSource只会从Web服务器的池中获取多个连接,并为您的应用程序"重新池化"它们,但这是不必要的,因为池化的主要原因是为了避免花费时间来获取真正的联系.这可能需要大约一秒钟,但不是很长时间,但会影响性能.但是JNDI池已经发生了这种延迟,因此再次汇集没有任何好处.

此外,您应该省略属性块,因为这些设置与本地连接池的工作方式有关,但如果您已经检索了池连接,则无需配置初始大小,最大大小,是否要测试借用/ return/etc.,验证查询等.这些设置应该在您通过JNDI提供的池的配置中进行,并且可以在Web服务器上完成.