MyBatis+Tomcat配置JNDI數據源

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章