JNDI

来源:互联网 发布:mysql字符串转日期函数 编辑:程序博客网 时间:2024/06/05 16:47
JNDI:
1、Java命名和目录接口
2、是一组在Java应用中访问命名和目录服务的API
3、通过名称将资源与服务进行关联
为什么使用连接池:
传统数据库连接方式的不足
1、每一次请求时均需要与数据库进行连接,资源占用较多
2、当并发访问数量较大时,网站速度收到极大影响
3、在访问结束后必须要关闭连接释放资源
4、系统的安全性和稳定性相对较差
企业级开发需要稳健和高效的数据访问层
1、完成对数据库的CRUD操作
2、能够处理数据库发生的各种错误
3、可以灵活的修改配置
4、提供方便使用的工具
5、高性能
什么是连接池技术:
1、连接池:连接池是在内存中预设计好一定数量的连接对象,以备用户在进行数据库操作时直接使用
2、性能:数据库连接的建立,断开均由管理池统一管理
3、连接池技术与传统数据库连接的比较
数据库操作性能得到提升
通过连接池管理数据库的连接与释放、提高了系统资源的使用
数据源简介:
数据源(DataSource)
javax.sql.DataSource接口负责建立与数据库的连接
从Tomcat的数据源获得连接
把连接保存在连接池中
如何获得DataSource对象:
数据源由Tomcat提供,不能在程序中创建实例
使用JNDI获得DataSource引用
<Context>    <!-- Default set of monitored resources -->    <WatchedResource>WEB-INF/web.xml</WatchedResource><Environment name="tjndi" value="Hello jndi" type="java.lang.String" /><Resource name="jdbc/cms" auth="Container" type="javax.sql.DataSource"  maxActive="100"  maxIdle="30" maxWait="10000"   username="wl"   password="Jredu12345" driverClassName="oracle.jdbc.driver.OracleDriver"  url="jdbc:oracle:thin:@localhost:1521:jredu" />    <!-- Uncomment this to disable session persistence across Tomcat restarts -->    <!--    <Manager pathname="" />    -->    <!-- Uncomment this to enable Comet connection tacking (provides events         on session expiration as well as webapp lifecycle) -->    <!--    <Valve className="org.apache.catalina.valves.CometConnectionManagerValve" />    --></Context>
public class BaseDao {//连接Connection conn=null;//声明PreparedStatement ps=null;//结果集ResultSet rs=null;//数据源DataSource source=null;{try {Context ic=new InitialContext();source=(DataSource) ic.lookup("java:comp/env/jdbc/cms");}  catch (NamingException e) {// TODO Auto-generated catch blocke.printStackTrace();}}private void getConnection() {try {conn=source.getConnection();System.out.println("数据库建立连接...");} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();System.out.println("数据库连接失败...");}}/** * 查询没有任何条件 * @param sql * @return */protected ResultSet excuteQuery(String sql) {return excuteQuery(sql, null);}/** * 查询时传一个数据参数 * @param sql * @param obj * @return */protected ResultSet excuteQuery(String sql,Object obj) {Object[] objs=new Object[1];objs[0]=obj;return excuteQuery(sql, objs);}/** * 查询时传递多个参数 * @param sql * @param objs * @return */protected ResultSet excuteQuery(String sql,Object[] objs) {getConnection();try {ps=conn.prepareStatement(sql);if(objs!=null) {for(int i=0;i<objs.length;i++) {ps.setObject(i+1, objs[i]);}}rs=ps.executeQuery();} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();System.out.println("sql查询出现错误...");}return rs;}/** * DML操作,增删改操作 * @param sql * @return */protected int excuteUpdate(String sql) {return excuteUpdate(sql, null);}/** * DML操作,增删改操作,传递一个参数 * @param sql * @return */protected int excuteUpdate(String sql,Object obj) {Object[] objs=new Object[1];objs[0]=obj;return excuteUpdate(sql, objs);}/** * DML操作,增删改操作,传递多个参数 * @param sql * @return */protected int excuteUpdate(String sql,Object[] objs) {System.out.println(sql);for(Object obj:objs){System.out.println(obj);}getConnection();//手动提交事务int ret=-1;try {//设置手动提交事务conn.setAutoCommit(false);conn.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);//封装sql语句ps=conn.prepareStatement(sql);if(objs!=null) {for(int i=0;i<objs.length;i++) {ps.setObject(i+1, objs[i]);}}//执行sql语句ret=ps.executeUpdate();conn.commit();} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();try {//回滚事务conn.rollback();} catch (SQLException e1) {// TODO Auto-generated catch blocke1.printStackTrace();}System.out.println("sql执行出现错误...");} finally {//关闭数据库连接closeStatement();}return ret;}/** * 关闭声明 */private void closeStatement() {try {if(ps!=null) {ps.close();}} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}}/** * 关闭所有结果集和声明 */protected void closeAll() {try {if(rs!=null) {rs.close();}if(ps!=null) {ps.close();}} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}



原创粉丝点击