我一直在搜索高低,并收集了点点滴滴,如果已经在其他地方已经回答了道歉,但我无法找到它。SQL Azure和连接池
我正在用Tomcat和SQL Azure在后端编写一个Java应用程序。
有多个servlet访问SQL Azure数据库。我想使用连接池通过Tomcat作为管理8.5
在META-INF我的应用程序的context.xml如下:
<Context>
<Resource name="jdbc/sqlazure"
auth="Container"
driverClassName="com.microsoft.sqlserver.jdbc.SQLServerDriver"
type="javax.sql.DataSource"
maxIdle="30"
username="[username]"
password="[password]"
url="jdbc:sqlserver://[database]:1433;database=BackInfo;encrypt=true;trustServerCertificate=false;hostNameInCertificate=*.database.windows.net;loginTimeout=30"
removeAbandonedTimeout="30"
logAbandoned="true" />
</Context>
在Java代码中,我访问的典型方式:
InitialContext ic = new InitialContext();ds = (DataSource)ic.lookup("java:comp/env/jdbc/sqlazure");
尝试(连接CON = ds.getConnection())....
一切似乎都工作,所以让我确认我的理解这里:
因为我使用的是Tomcat 8.5,所以我不需要指定单独的web.xml。正确吗?
当我以这种方式连接时,Azure会自动创建池。池中的连接数量等不能(不需要?)配置。
在我意识到需要访问数据库的其他servlet之前,我有一个servlet通过SQLServerConnectionPoolDataSource直接创建数据源并从那里获取连接。该文件指出:
SQLServerConnectionPoolDataSource通常在支持内置的连接池和要求的ConnectionPoolDataSource提供物理连接,如Java平台企业版(Java EE)应用程序的Java应用服务器环境中使用提供JDBC 3.0 API规范连接池的服务器。
这是否意味着当我使用SQLServerConnectionPoolDataSource直接要求一个连接时,它会检查是否Tomcat的支持池,然后基本上用JDBC机制来创建的池由Tomcat管理的SQL Azure连接?
当通过Tomcat JNDI查找获取数据源时,使用context.xml中指定的SQLServerDriver。当Web应用程序启动时,它将检查context.xml并使用SQLServerDriver连接到SQL Azure,检查是否支持池,如果是,那么Tomcat正在使用该驱动程序自动创建它返回的连接池数据源?
我也只是想到了另一个问题。有一个Singleton DataSource类返回对池连接数据源的引用是否有意义,还是让每个servlet在其init()中查找数据源并存储在一个私有变量中会更好?
感谢
感谢彼得,我读过这和有没有问题,通过JNDI访问,但一些配置参数我用诸如大小在联系Azure端时池似乎不被接受,这让我认为Azure会自动管理池?否则,为什么不从Tomcat中最大化连接池的大小呢? – fobius