Ejb数据源和连接池 连接池实现的原理: 在应用启动时建立一定数据的数据库连接,并将这些数据库连接作为对象存储在一个容器对象中。而程序中所有的数据库请求访 问都可以共享这些连接,这样,通过复用这些已经建立的数据库连接,不必在每次访问数据库时都重新建立连接,极大的节省了系统资源 和时间。另外,为了回收并重新使用那些没有即使关闭的数据库连接,连接池都提供了一种超时回收机制。也就是当数据库的连接在指定 的事件内没有活动,连接池就把这些连接重新放到可以使用的队列。新的连接请求到来是便可以再次使用这些连接。这种超时回收连接的 机制可以克服数据库连接泄漏的问题。 DBCP连接池:它依赖于jakata commons-pool对象池吉之岛数据库连接池,DBCP可以直接在应用程序中使用。需要下载Jar: commons-dbcp-1.2.1.jar,commons-pool-1.3.jar,commons-collections-3.2.jar 将上述三个.jar文件保存到项目的WEB-INF/lib下,即加入到CLASSPATH中。 •Tomcat中的数据源 在程序中使用数据源有两种方式:一种是在程序中直接创建类的对象,该对象实现了JDBC驱动程序中的DataSource接口,并使用 该对象获取数据库连接;另一种方法是使用JNDI注册数据源,然后在程序中查询JNDI服务中的数据源,这样用户就只需要提供一个逻辑名 称,而不是数据库登录的具体细节。 一. 配置数据源:要使用第二种形式的JNDI数据源,必须首先进行配置数据源的JNDI命名服务。由于Tomcat提供了一个称为DBCP(Database Connection Pool)的数据源实现,所以可以在Service.xml文件中进行数据源的配置即可。 1. 安装jar,将上述几个jar存放与TOMCAT_HOME/common/lib位置。 2. 将相应的后台数据库的JDBC驱动器到TOMCAT_HOME/common/lib下。如OrecleJDBC驱动class12.jar,Sqlserver2000JDBC驱动 mssqlserver.jar,msutil.jar。 3. 配置TOMCAT_HOME/conf/server.xml文件的<Context>和</Context></host>标签之间添加资源声明。 •<!-- Oracle连接池--> <Context path="/ch14" docBase="d:/ch14" crossContext="true" debug="0" reloadable="true"> <Resource name="jdbc/oracle/ora9" auth="Container" type="javax.sql.DataSource" factory="org.apache.commons.dbcp.BasicDataSourceFactory" driverClassName="oracle.jdbc.driver.OracleDriver" url="jdbc:oracle:thin:@localhost:1521:ora9" username="system" password="123456" maxActive="20" maxWait="-1" /> </Context> •<!-- Sqlserver连接池--> <Context path="/sqlserverds" reloadable="true" docBase="D:/eclipseApp/webappsl/sqlserverds" WorkDir="D:/eclipseApp/webapps/sqlserverds/work"> <Resource name="jdbc/sqlserver/sqlserverDS" auth="Container" type="javax.sql.DataSource" factory="org.apache.commons.dbcp.BasicDataSourceFactory" driverClassName="com.microsoft.jdbc.sqlserverSQLServerDriver" url="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=Sql2000DB" username="sa" password="sa" maxActive="20" maxldle="10" maxWait="-1" /> </Context> <!-- mysql连接池 --> <Context path="/ch14" docBase="ch14" debug="0" reloadable="true" crossContext="true"> <Resource name="jdbc/mysql/sql_test" auth="Container" type="javax.sql.DataSource" factory="org.apache.commons.dbcp.BasicDataSourceFactory" driverClassName="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:sql_test?userUnicaod=true&characterEncoding=gb2312" uesrname="root" password="root" maxActive="20" maxIdle="10" maxWait="-1" /> </Context> <!-- ========================================--> <!— 说明:对于大型应用,如果需要跨数据库操作,则可以在一个<Context>标记中配置国歌<Resource>子标记。 --> <!-- =========================================--> web应用程序中数据源的使用方式: 1.设计提供连接对象Connection的类 package db; import java.sql.*; import javax.sql.DataSrouce; import javax.naming.Context; import javax.naming.InitialContext; //注意:获得的Connection对象不能在普通的java类(如在main函数中)直接调用。因为数据源有web服务器管理。 final public class Database{ public Database(){} privaate static DataSrouce ds = null ; //静态成员 /*static{ //初始化静态成员 try{ Context init = new InitialContext(): Context envCtx = (Context) initCtx.lookup("java:comp/env"); ds = (DataSource) envCtx.lookup("jdbc/oracle/ora9"); }catch(Exception e){e.printStackTrace();} }*/ //初始化数据源 public static void initialize(){ try{ Context init = new InitialContext(): Context envCtx = (Context) initCtx.lookup("java:comp/env"); ds = (DataSource) envCtx.lookup("jdbc/oracle/ora9"); }catch(Exception e){e.printStackTrace();} } //从连接池中获取一个连接 public static Connection getConnection(){ Connection conn = null; try{ conn = ds.getConnection(); }catch(Exception e){e.printStackTrace();} return conn; } } 2. 在业务逻辑方法处理类中使用池中的连接 package db; import java.sql.*; import java.util.*; //业务逻辑层 public class BusinessLayer{ //这个方法是在jsp页面或servlet中调用的业务逻辑方法(专业用法) public Collection getNewPost(String sql){ Collection<PostBean> postList = new ArrayList<PostBean>(); Database db = new Database(); Connection conn = null; Statement st = null; ResultSet rs = null; try{ conn = db.getConnection(): st = conn.createStatement(); rs = st.executeQuery(sql); String province , city,tele,post; while(rs.next()){ province = rs.getString("province"); city = rs.getString("city"); tele = rs.getString("tele"); post = rs.getString("post"); String t = province + "/t" + city + "/t" + tele + "/t" + post; PostBean pb = new PostBean(province,city,tele,post); postList.add(pb); System.out.println(t); } }catch(Exception e){ ... }finally{ try{ if(st != null )st.close(); if(rs != null)rs.close(); if(conn != null) conn.close(): }catch(Exception e){...} } return postList; } } 3. 在web页面中调用业务逻辑方法 <% //要执行的语句 String sql= "select * from post where province = '四川'"; db.BusinessLayer bl = new db.BusinessLayer(); Collection postList = bl.getNewPost(sq;); //获取集合对象 ...... %> 4. 配置web.xml文件(数据源在web.xml中的配置,对于Tomcat高版本不是必需的) <web-app> <description>JSP中的高级数据库应用实例</description> <resource-ref> <description>DataSource</description> <res-ref-name>jdbc/oracle/ora9</res-ref-name> //与server.xml中名称一致 <res-type>javax.sql.DataSource<res-type> <res-auth>Container</res-auth> </resource-ref> </web-app> Jboss数据源的配置 数据源用于配置数据库的连接信息,每个数据源必须指定一个唯一的JNDI名称。应用通过JNDI名称找到数据源。在Jboss中,有一个默认的数据源DefaultDS,他使用Jboss内置的HSQLDB数据库。实际项目中可能使用不同的数据库,如MySql、SqlServer、Oracle等。每种数据库的数据源配置版可以在Jboss安装目录/docs/examples/jca目录中找到,名称为:数据库-ds.xml。 数据源配置文件的取名格式必须为xxx-ds.xml,如:mysql-ds.xml,oracle-ds.xml。数据源部署前,必须把数据库驱动Jar拷贝到[jboss安装目录]/server/default/lib。拷贝后,必须重启Jboss服务器。 MySql数据源的配置: 【mysql-ds.xml]】 <?xml version="1.0" encoding="UTF-8"?> <datasources> <local-tx-datasource> <jndi-name>MySqlDS</jndi-name> <connection-url>jdbc:mysql://localhost:3306/foshanshop</connection-url> <driver-class>com.mysql.jdbc.Driver</driver-class> <user-name>root</user-name> <password>aljoin</password> <!—最小的连接数 --> <min-pool-size>3</min-pool-size> <!—最大的连接数-- > <max-pool-size>32</max-pool-size> <!—抛出异常前最大的等待连接时间 -- > <bloking-timeout-millis>30000</blocking-timeout-millis> <!—关闭连接前连接空闲的最大时间 -- > <idel-timeout-minutes>5</idel-timeout-minutes> <exception-sorter-class-name> org.jboss.resource.adapter.jdbc.vendor.MySQLExceptionSorter </exception-sorter-class-name> <metadata> <type-mapping>mySQL</type-mapping> </metadata> </local-tx-datasource> </datasources> SqlServer数据源的配置: 【mssqlserver-ds.xml]】 <?xml version=”1.0” encoding=”UTF-8”?> <datasource> <local-tx-datasource> <jndi-name>MSSQLDS</jndi-name> <connectin-url> Jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=foshanshop </connection-url> <driver-class> Com.microsoft.jdbc.sqlserver.SQLServerDriver </driver-class> <user-name>sa</user-name> <password>sa</password> <metadata> <type-mapping>MS SQLSERVER2000</type-mapping> </metadata> </local-tx-datasource> </datasource> Oralce9i数据源的配置: 【oracle-ds.xml]】 <?xml version=”1.0” encoding=”UTF-8”?> <datasource> <local-tx-datasource> <jndi-name>OracleDS</jndi-name> <connection-url> Jdbc:oracle:thin:@192.168.1.2:1521:FS </connection-url> <driver-class> Oracle.jdbc.driver.OracleDriver <driver-class> <user-name>root</user-name> <password>root</password> <exception-sorter-class-name> Org.jboss.resource.adapter.jdbc.vendor.OracleExceptoiinSorter </exception-sorter-class-name> <metadata> <type-mapping>Oracle9i<type-mapping> </metadata> </local-tx-datasource> </datasource> •Jboss配置数据源操作方式: Jboss数据库连接池 wwx 为数据库名 UserInfor为表名 数据库用户名和密码分别为:root root 参考 http://www.matrix.org.cn/translation/Wiki.jsp?page=J2EEEJB_JbossJDBC (该blog 包括几个主要数据库的连接) MySQL是一个开放源代码的数据库,有很多开源项目和小型的社团都在使用它。 一 把mysql-connector-java-3.1.11-bin.jar复制到/server/default/lib目录下, (需要mysql-connector-java-3.0.16-ga.zip包 将里面的jar文件取出) 二 再把/docs/examples/jca/mysql-ds.xml复制到/server/default/deploy目录下。修改mysql-ds.xml文件,设置为 com.mysql.jdbc.Driver再把设置为jdbc:mysql:///,其中是数据库主机名是数据库名。 例:<datasources> <local-tx-datasource> <jndi-name>MySqlDS</jndi-name> <connection-url>jdbc:mysql://localhost:3306/wwx</connection-url>//wwx <driver-class>com.mysql.jdbc.Driver</driver-class> <user-name>root</user-name> <password>root</password> </local-tx-datasource> </datasources> 注意:如果localhost不行 就用127.0.0.1 这个一定没问题! 还有就是如果数据库没有密码!那么就这样<password></password> 三 然后需要设置standardjaws.xml (或 jaws.xml 注: /server/default/conf目录下)文件的和元素: <jaws> <datasource>java:/MySqlDS</datasource> <type-mapping>mySql</type-mapping> 。。。。。。。 </jaws> 四 同样也需要把standardjbosscmp-jdbc.xml (或 jbosscmp-jdbc.xml文件 注: /server/default/conf目录下)的 和 元素设置为下面这样: <jbosscmp-jdbc> <defaults> <datasource>java:/MySqlDS</datasource> <datasource-mapping>mySql</datasource-mapping> </defaults> </jbosscmp-jdbc> 说明:<datasource-mapping>mySql</datasource-mapping>在我的Jboss里面是被注释掉的,但我把拿回来! 就是把 <----和------ 都删掉! 五 最后再修改login-config.xml(/server/default/conf目录下)文件来使用MySQL: <application-policy name = "MySqlDbRealm"> <authentication> <login-module code = "org.jboss.resource.security.ConfiguredIdentityLoginModule" flag = "required"> <module-option name ="principal">wwx</module-option> <module-option name ="userName">root</module-option> <module-option name ="password">root</module-option> <module-option name="managedConnectionFactoryName"> jboss.jca:service=LocalTxCM,name=MySqlDS </module-option> </login-module> </authentication> </application-policy> 说明:这段代码就直接 copy到login-config.xml里面就ok!不知道往哪放吗? 嘿嘿,就放在<policy> 下面吧! 还有就是如果数据库没有密码!那么就这样<module-option name ="password"></module-option> 六 修改了mysql-ds.xml, standardjaws.xml, standardjbosscmp-jdbc.xml,和 login-config.xml 文件就可以在Jboss上使用MySQL了。 七 调试代码 在jboss-4.0.2/server/default/deploy下 建个文件夹 : test.war 里面test.jsp, 代码如下! <%@pageimport="javax.naming.*"%> <%@pageimport="javax.sql.*"%> <%@pageimport="java.sql.*"%> <% try { Context ctx = new InitialContext(); //得到初始化上下文 Object obj = ctx.lookup("java:/MySqlDS");//查找连接池 DataSource ds = (DataSource) obj;//转换成DataSource Connection connect = ds.getConnection();//从连接池中得到一个连接 Statement stmt = connect.createStatement(); ResultSet rs = stmt.executeQuery("select * from num");//这是你的数据库的表噢! while(rs.next()){ out.println(rs.getObject("NO"));//取出一个字段 } } catch (NamingException e) { e.printStackTrace(); } catch(SQLException e1){ e1.printStackTrace(); } out.flush(); out.close(); %>