JNDI:java命名与目录接口
pageContext < request< session< application(一个项目运行期间都有效)
String jndiName = “jndiValue” ;
abc 对象(资源…)
jndi:将某一个资源(对象),以配置文件(tomcat/conf/context.xml)的形式写入;
实现步骤:
tomcat/conf/context.xml配置:
<Environment name="jndiName" value="jndiValue" type="java.lang.String" />
jsp中用:
<%
Context ctx = new InitialContext() ;
String testJndi = (String)ctx.lookup("java:comp/env/jndiName");
out.print(testJndi);
%>
连接池
常见连接池:Tomcat-dbcp、dbcp、c3p0、druid
可以用数据源(javax.sql.DataSource)管理连接池
Tomcat-dbcp
a.类似jndi,在context.xml中配置数据库
<Resource name="student"
auth="Container"
type="javax.sql.DataSource"
maxActive="400"
maxIdle="20"
maxWait="5000"
username="root"
password="19981015"
driverClassName="com.mysql.cj.jdbc.Driver"
url="jdbc:mysql://localhost:3306/testdata? useSSL=false&serverTimezone=UTC" />
b.在项目的web.xml中
<resource-ref>
<res-ref-name>student</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
c.使用数据源
更改 连接对象Connection的获取方式 :
传统Jdbc方式
connection = DriverManager.getConnection(URL,USERNAME,PASSWORD);
数据源方式:
Context ctx = new InitialContext() ;//context.xml
DataSource ds = (DataSource)ctx.lookup(“java:comp/env/student”) ;
connection = ds.getConnection();
tomcat-dbcp数据源总结:
a.配置数据源(context.xml)
b.指定数据源(web.xml)
c.用数据源 :通过数据库获取Connection
dbcp连接池
连接池:
怎么用?
不用连接池
Class.forName();
Connection connection = DriverManager.getConnection();//连接指向数据库
用连接池的核心:将连接的指向改了,现在指向的是数据源 而不是数据库。
…-> DataSource ds = …
Connection connection =ds.getConnection();//指向的是数据源的连接
数据库访问核心 -> pstmt/stmt ->connection ->1.直接数据库 2.数据源 ds.getConnection()
PreparedStatemnt pstmt = connection.preparedStatement();
commons-dbcp-1.4.jar、commons-pool.jar
dbcp获取ds: BasicDataSource、BasicDataSourceFactory
BasicDataSource方式(硬编码):DasicDataSource对象设置各种数据
BasicDataSourceFactory方式: 配置方式(.properties文件, 编写方式key=value)
dbcpconfig.properties
BasicDataSourceFactory.createDataSource(props )
通用:NoClassDefFoundError异常 说明少jar
DataSource 是所有sql数据源的上级类。BasicDataSource是dbcp类型的数据源,ComboPooledDataSource是c3p0类型的数据源;XxxDataSource…
c3p0连接池 :ComboPooledDataSource
两种方式
硬编码
配置文件
->合二为一 ,通过ComboPooledDataSource的构造方法参数区分:如果无参,硬编码;有参,配置文件
c3p0.jar c3p0-oracle-thin-extras.jar
a.无参,硬编码
ComboPooledDataSource c3p0 = new ComboPooledDataSource();
c3p0.set…();
b.有参,配置文件(c3p0-config.xml)
oralce修改密码:
管理员状态 sqlplus / as sysdba
alter user scott identified by tiger ;
所有连接池的思路:
a.硬编码,某个连接池数据源的 对象 ds = new XxxDataSource(); ds.setXxx(); return ds ;
b.配置文件, ds = new XxxDataSource();加载配置文件 ,return ds ;
package com.yanqun.util;
import com.mchange.v2.c3p0.ComboPooledDataSource;
import org.apache.commons.dbcp.BasicDataSource;
import org.apache.commons.dbcp.BasicDataSourceFactory;
import javax.sql.DataSource;
import java.beans.PropertyVetoException;
import java.io.InputStream;
import java.util.Properties;
public class DataSourceUtil {
//获取dbcp方式的ds对象
public static DataSource getDataSourceWIthDBCP(){
BasicDataSource dbcp = new BasicDataSource();
dbcp.setDriverClassName("oracle.jdbc.driver.OracleDriver");
dbcp.setUrl("jdbc:oracle:thin:@127.0.0.1:1521:ORCL");
dbcp.setUsername("scott");
dbcp.setPassword("tiger");
dbcp.setInitialSize(20);
dbcp.setMaxActive(10);
return dbcp;
}
public static DataSource getDataSourceWIthDBCPByProperties() throws Exception{
DataSource dbcp = null ;
Properties props = new Properties();
InputStream input = new DBCPDemo().getClass().getClassLoader().getResourceAsStream("dbcpconfig.properties");
props.load( input );
//只需要记住以下一句
dbcp = BasicDataSourceFactory.createDataSource(props ) ;
return dbcp;
}
public static DataSource getDataSourceWithC3P0(){
ComboPooledDataSource c3p0 = new ComboPooledDataSource();
try {
c3p0.setDriverClass("oracle.jdbc.driver.OracleDriver");
} catch (PropertyVetoException e) {
e.printStackTrace();
}
c3p0.setJdbcUrl("jdbc:oracle:thin:@127.0.0.1:1521:ORCL");
c3p0.setUser("scott");
c3p0.setPassword("tiger");
return c3p0 ;
}
public static DataSource getDataSourceWithC3P0ByXml(){
ComboPooledDataSource c3p0 = new ComboPooledDataSource("yanqun");
return c3p0 ;
}
}
dbcpconfig.properties
driverClassName=oracle.jdbc.driver.OracleDriver
url=jdbc:oracle:thin:@127.0.0.1:1521:ORCL
username=scott
password=tiger
initialSize=10
c3p0-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
<default-config>
<!-- 如果要研究某个xml中可以设置哪些属性。找相关类的 属性 或者setXxx()-->
<property name="user">scott</property>
<property name="password">tiger</property>
<property name="driverClass">oracle.jdbc.driver.OracleDriver</property>
<property name="jdbcUrl">jdbc:oracle:thin:@127.0.0.1:1521:ORCL</property>
<property name="checkoutTimeout">30000</property>
</default-config>
<named-config name="yanqun">
<property name="user">scott</property>
<property name="password">tiger</property>
<property name="driverClass">oracle.jdbc.driver.OracleDriver</property>
<property name="jdbcUrl">jdbc:oracle:thin:@127.0.0.1:1521:ORCL</property>
<property name="checkoutTimeout">20000</property>
</named-config>
</c3p0-config>
="driverClass">oracle.jdbc.driver.OracleDriver</property>
<property name="jdbcUrl">jdbc:oracle:thin:@127.0.0.1:1521:ORCL</property>
<property name="checkoutTimeout">20000</property>
</named-config>
</c3p0-config>