JNDI數(shù)據(jù)庫(kù)連接池
PHP事實(shí)上是沒有真正意義上的連接池的。在使用傳統(tǒng)的PHP API時(shí),Quercus也不例外。為了利用JDBC連接池,有如下選擇:
(1)使用DBCP等Java連接池,但是這樣必須在PHP代碼中使用import語(yǔ)句。
(2)編寫一個(gè)Java DAO,然后暴露給Quercus,但這樣調(diào)試、修改都不方便。
(3)使用JNDI配合PDO。
第三種方法和Native PHP的PDO行為最為接近,且不需要在代碼中顯式配置。將來(lái)如果換用Native PHP,僅更改連接字符串即可。
首先需要在Tomcat的context.xml中添加如下配置:
<Context>
...
<Resource name="jndischool" auth="Container" type="javax.sql.DataSource"
maxActive="100" minIdle="10" maxWait="10000" initialSize="10"
username="dba" password="123456" driverClassName="org.postgresql.Driver"
url="jdbc:postgresql://127.0.0.1:5432/school" factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
validationQuery="SELECT 1" validationInterval="30000"
timeBetweenEvictionRunsMillis="30000" removeAbandonedTimeout="60"
removeAbandoned="true" logAbandoned="true" minEvictableIdleTimeMillis="30000"
jmxEnabled="true" jdbcInterceptors="org.apache.tomcat.jdbc.pool.interceptor.ConnectionState;org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer" />
...
</Context>
然后在應(yīng)用的web.xml下添加配置如下:
<web-app>
...
<resource-ref>
<description>Datasource of school.</description>
<res-ref-name>jndischool</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
此時(shí)即可在Quercus中使用這個(gè)數(shù)據(jù)源,Tomcat的JNDI數(shù)據(jù)源格式為java:comp/env/jndiname。
$connectionString = "java:comp/env/jndischool";
$conn = new PDO($connectionString);
...