连接到SQL数据库 connecting-to-sql-databases
访问外部SQL数据库,以便CQ应用程序可以与数据交互:
捆绑JDBC数据库驱动程序 bundling-the-jdbc-database-driver
某些数据库供应商在OSGi捆绑包中提供JDBC驱动程序,例如MySQL。 如果数据库的JDBC驱动程序不能作为OSGi捆绑包使用,请获取驱动程序JAR并将其包装在OSGi捆绑包中。 捆绑包必须导出与数据库服务器交互所需的包。 捆绑包还必须导入其引用的包。
以下示例使用Maven🔗的Bundle插件将HSQLDB驱动程序封装在OSGi捆绑包中。 POM指示插件嵌入标识为依赖项的hsqldb.jar文件。 将导出所有org.hsqldb软件包。
插件会自动确定要导入的包,并在包的MANIFEST.MF文件中列出这些包。 如果CQ服务器上没有任何软件包,则安装时不会启动捆绑包。 两种可能的解决方案如下:
-
在POM中指明程序包是可选的。 当JDBC连接实际上不需要包成员时,请使用此解决方案。 使用Import-Package元素指示可选软件包,如以下示例所示:
<Import-Package>org.jboss.*;resolution:=optional,*</Import-Package>
-
将包含包的JAR文件包装在导出包的OSGi捆绑包中,并部署该捆绑包。 当代码执行期间需要包成员时,请使用此解决方案。
了解源代码后,您可以决定要使用哪个解决方案。 您还可以尝试任一解决方案并执行测试以验证解决方案。
捆绑了hsqldb.jar的POM pom-that-bundles-hsqldb-jar
<project xmlns="https://maven.apache.org/POM/4.0.0"
xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="https://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.adobe.example.myapp</groupId>
<artifactId>hsqldb-jdbc-driver-bundle</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>wrapper-bundle-hsqldb-driver</name>
<url>www.adobe.com</url>
<description>Exports the HSQL JDBC driver</description>
<packaging>bundle</packaging>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
<version>1.4.3</version>
<extensions>true</extensions>
<configuration>
<instructions>
<Embed-Dependency>*</Embed-Dependency>
<_exportcontents>org.hsqldb.*</_exportcontents>
</instructions>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>hsqldb</groupId>
<artifactId>hsqldb</artifactId>
<version>2.2.9</version>
</dependency>
</dependencies>
</project>
以下链接可打开某些常用数据库产品的下载页面:
配置JDBC连接池服务 configuring-the-jdbc-connection-pool-service
为使用JDBC驱动程序创建数据源对象的JDBC连接池服务添加配置。 您的应用程序代码使用此服务来获取对象并连接到数据库。
JDBC连接池(com.day.commons.datasource.jdbcpool.JdbcPoolService
)是工厂服务。 如果需要使用不同属性(例如,只读或读/写访问)的连接,请创建多个配置。
使用CQ时,可通过多种方法管理此类服务的配置设置;有关完整的详细信息,请参阅配置OSGi。
以下属性可用于配置池连接服务。 在Web控制台中列出的属性名称如下所示。 sling:OsgiConfig
节点的相应名称显示在括号中。 显示了HSQLDB服务器和别名为mydb
的数据库示例值:
-
JDBC驱动程序类(
jdbc.driver.class
):用于实现java.sql.Driver接口的Java™类,例如org.hsqldb.jdbc.JDBCDriver
。 数据类型是String
。 -
JDBC连接URI (
jdbc.connection.uri
):用于创建连接的URL,例如jdbc:hsqldb:hsql//10.36.79.223:9001/mydb
。 URL的格式必须对java.sql.DriverManager类的getConnection方法有效。 数据类型是String
。 -
用户名(
jdbc.username
):用于向数据库服务器进行身份验证的用户名。 数据类型是String
。 -
密码(
jdbc.password
):用于验证用户的密码。 数据类型是String
。 -
验证查询(
jdbc.validation.query
):用于验证连接是否成功的SQL语句,例如select 1 from INFORMATION_SCHEMA.SYSTEM_USERS
。 数据类型是String
。 -
默认只读(default.readonly):如果希望连接提供只读访问权限,请选择此选项。 数据类型是
Boolean
。 -
默认自动提交(
default.autocommit
):选择此选项可以为发送到数据库的每个SQL命令创建单独的事务,并且每个事务都会自动提交。 在代码中明确提交事务时,请勿选择此选项。 数据类型是Boolean
。 -
池大小(
pool.size
):数据库可用的同时连接数。 数据类型是Long
。 -
池等待(
pool.max.wait.msec
):连接请求超时之前经过的时间。 数据类型是Long
。 -
数据源名称(
datasource.name
):此数据源的名称。 数据类型是String
。 -
其他服务属性(
datasource.svc.properties
):要附加到连接URL的一组名称/值对。 数据类型是String[]
。
JDBC连接池服务是一个工厂。 因此,如果您使用sling:OsgiConfig
节点配置连接服务,则该节点的名称必须包含工厂服务PID,后跟 -alias
。 您使用的别名对于该PID的所有配置节点必须是唯一的。 示例节点名称为com.day.commons.datasource.jdbcpool.JdbcPoolService-myhsqldbpool
。
连接到数据库 connecting-to-the-database
在Java™代码中,使用DataSourcePool服务为您创建的配置获取javax.sql.DataSource
对象。 DataSourcePool服务提供getDataSource
方法,该方法返回给定数据源名称的DataSource
对象。 作为方法参数,请使用为JDBC连接池配置指定的数据源名称(或datasource.name
)属性的值。
以下示例JSP代码获取hsqldbds数据源的实例,执行简单的SQL查询,并显示返回的结果数。
执行数据库查找的JSP jsp-that-performs-a-database-lookup
<%@include file="/libs/foundation/global.jsp"%><%
%><%@page session="false"%><%
%><%@ page import="com.day.commons.datasource.poolservice.DataSourcePool" %><%
%><%@ page import="javax.sql.DataSource" %><%
%><%@ page import="java.sql.Connection" %><%
%><%@ page import="java.sql.SQLException" %><%
%><%@ page import="java.sql.Statement" %><%
%><%@ page import="java.sql.ResultSet"%><%
%><html>
<cq:include script="head.jsp"/>
<body>
<%DataSourcePool dspService = sling.getService(DataSourcePool.class);
try {
DataSource ds = (DataSource) dspService.getDataSource("hsqldbds");
if(ds != null) {
%><p>Obtained the datasource!</p><%
%><%final Connection connection = ds.getConnection();
final Statement statement = connection.createStatement();
final ResultSet resultSet = statement.executeQuery("SELECT * from INFORMATION_SCHEMA.SYSTEM_USERS");
int r=0;
while(resultSet.next()){
r=r+1;
}
resultSet.close();
%><p>Number of results: <%=r%></p><%
}
}catch (Exception e) {
%><p>error! <%=e.getMessage()%></p><%
}
%></body>
</html>