现阶段我们在开发报表的时候,是使用jdbc链接数据库的,为提高报表的运行效率和稳定性,使用连接池进行管理。比较简便和低耦合的解决办法,使用jndi连接池。
jdbc和jndi的区别
JDBC -最基本的连接数据库的方式, 每次对数据库打交道的时候 ,连接数据库是需要实例下你实现连接数据库的方法或者类。
JNDI DataSource 英文全称是:Java Naming and Directory Interface java 命明接口,当服务启动时 事先把连接数据库的已经连好多条,具体多少条你可以设置,存放在tomcat容器里,用的时候可以直接使用, 不用再实例化得到连接, 相对与jdbc效率要快点
在eclipse设计报表的时候,我们使用jdbc链接数据库做测试,当到了tomcat运行环境中切换到jndi连接池,这是比较方便的开发方法。
实现步骤:
1.tomcat配置jndi连接池
在 {tomcat目录}\webapps\{项目名}\META-INF 中新增context.xml文件,配置代码如下
<?xml version="1.0" encoding="UTF-8"?>
<Context>
<Resource
auth="Container"
name="jdbc/travel_agency"
type="javax.sql.DataSource"
maxIdle="5"
maxWait="-1"
driverClassName="com.mysql.jdbc.Driver"
username="itravel"
password="709394"
url="jdbc:mysql://192.168.1.100/travel_agency?useUnicode=true&characterEncoding=UTF-8"
maxActive="10"/>
</Context>
2.在web.xml中加入配置
<resource-ref>
<description>Database Source</description>
<res-ref-name>jdbc/travel_agency</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
3.实例报表中数据源代码
1 <data-sources>
2 <oda-data-source extensionID="org.eclipse.birt.report.data.oda.jdbc" name="数据源" id="227">
3 <property name="odaDriverClass">com.mysql.jdbc.Driver</property>
4 <property name="odaURL">jdbc:mysql://192.168.1.100/travel_agency</property>
5 <property name="odaUser">itravel</property>
6 <encrypted-property name="odaPassword" encryptionID="base64">NzA5Mzk0</encrypted-property>
7 <property name="odaJndiName">java:comp/env/jdbc/travel_agency</property>
8 </oda-data-source>
9 </data-sources>
除了第7行 <property name="odaJndiName">java:comp/env/jdbc/travel_agency</property>,其余是我们的之前的配置。用了第7行的代码,表示该报表支持jndi数据源,birt在运行报表的时候,会先用jndi去连接,如果失败了再用jdbc链接,这样做的好处就是,我们在开发报表的时候,没有放到web环境中,可以使用jdbc,当放到tomcat中,因为有了第7行的配置。默认采用jdni连接。
4.步骤3中第6行密码的生成程序(JAVA程序)
package com.hollycrm.birt.security;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import sun.misc.BASE64Encoder;
public class CreateBirtBase64Password {
public static void main(String[] args) {
InputStreamReader inStreamReader = new InputStreamReader(System.in);
BufferedReader buffReader = new BufferedReader(inStreamReader);
System.out.println("请输入需要通过Base64加密的字符串:");
String strSrcPassword = null;
try {
strSrcPassword = buffReader.readLine();
if (strSrcPassword != null) {
// 通过用户输入的密码信息生成Base64的加密密码
String strBase64Password = new BASE64Encoder().encode(strSrcPassword.trim().getBytes());
System.out.println("您输入的原始密码为:" + strSrcPassword + "\r对应生成的Base64密码值为:" + strBase64Password);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}