MyBatis通過配置mybatis-config.xml文件的dataSource標籤配置數據源類型以及屬性。除UNPOOLED和POOLED外,mybatis支持JNDI方式從外部服務中獲取數據源配置。
JNDI(Java命名與目錄接口)是SUN公司提供的一種標準的Java命名系統接口,通過名稱獲取到服務對象。以Tomcat爲例的服務器自帶數據庫連接池,默認採用DBCP連接池,jar包位於lib目錄下。此時,Web應用使用Tomcat提供的數據庫連接池服務,通過JNDI名稱查找數據源。
mybatis-config.xml配置
mybatis主要配置dataSource的type屬性爲JNDI,並設置JNDI名稱,用於系統查找數據源。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="JNDI">
<property name="data_source" value="java:comp/env/jdbc/mybatis"/>
</dataSource>
</environment>
</environments>
</configuration>
配置數據源
數據源有多種配置方式,包括全局配置和局部配置。其中全局配置是對Tomcat /conf目錄的context.xml文件進行配置,局部配置只在當前項目中生效,在項目目錄webapp/META_INF目錄創建context.xml文件,配置內容如下:
<?xml version="1.0" encoding="UTF-8"?>
<Context>
<Resource
name="jdbc/mybatis" 數據源的名稱
type="javax.sql.DataSource" 數據源類型--通過name獲取到type類型的服務
auth="Container" 數據源提供者 tomcat
maxActive="20" 最大活動數
maxWait="10000" 最大等待時間 s
maxIdle="5" 最大空閒數
username="root" 用戶名
password="123456" 密碼
driverClassName="com.mysql.jdbc.Driver" 驅動類
url="jdbc:mysql://localhost:3306/mybatis" 連接url字符串
/>
</Context>
測試JNDI獲取數據源
採用Servlet進行簡單測試。自servlet3.0後可以不用再web.xml裏面配置servlet,只需要加上@WebServlet
註解就可以修改該servlet的屬性。
@WebServlet("/jndi")
public class JNDIServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Connection conn = null;
try {
Context initContext = new InitialContext();
Context envContext = (Context) initContext.lookup("java:/comp/env");
DataSource ds = (DataSource) envContext.lookup("jdbc/mybatis");
conn = ds.getConnection();
System.out.println(conn);
} catch (NamingException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
瀏覽器訪問http://localhost:8080/advanced_java_war_exploded/jndi,控制檯會打印出數據源信息。
1520309599, URL=jdbc:mysql://localhost:3306/mybatis, UserName=root@localhost, MySQL Connector/J
當然也可以使用JSP測試,效果是一樣的。
<%@ page import="javax.naming.Context" %>
<%@ page import="javax.naming.InitialContext" %>
<%@ page import="javax.sql.DataSource" %>
<%@ page import="java.sql.Connection" %>
<%@ page import="javax.naming.NamingException" %>
<%@ page import="java.sql.SQLException" %>
<html>
<body>
<h2>Hello World!</h2>
<%
Connection conn = null;
try {
Context initContext = new InitialContext();
Context envContext = (Context)initContext.lookup("java:/comp/env");
DataSource ds = (DataSource)envContext.lookup("jdbc/mybatis");
conn = ds.getConnection();
System.out.println(conn);
} catch (NamingException e) {
System.out.println(e.getMessage());
} catch (SQLException e) {
e.printStackTrace();
} finally {
conn.close();
}
%>
</body>
</html>
參考文檔
http://tomcat.apache.org/tomcat-8.0-doc/jndi-datasource-examples-howto.html