Cómo implementar mybatis sqlsessiontemplate
prueba {
sqlSession = sqlSessionFactory.openSession()
//id del espacio de nombres
sqlSession.insert; ("cn.jarjar.dao.BlogMapper.insertBlog", blog);
Al igual que el objeto sqlSession.Connection, debes seguir los siguientes pasos: Crear una nueva conexión - Ejecutar SQL - Enviar (no se requiere consulta) ) - Si se produjo una excepción durante la operación y es necesario revertir los datos, libere la conexión de la base de datos. Tenga en cuenta el primer y último punto: cada SqlSession debe liberarse después de crear una nueva SqlSession; de lo contrario, existirá el riesgo de que se produzca una fuga en la conexión de la base de datos. En otras palabras, esto significa que SqlSession es un objeto con estado que no se puede reutilizar, por lo que solo se puede limitar al alcance de la solicitud o método, lo que se denomina subproceso inseguro.
Fenómeno 2: si está utilizando mybatis integrado de Spring, todo el paquete de software proporcionado oficialmente y mybatis-spring.jar, si completa la configuración, se producirá un problema. jar, si ha completado la configuración, su uso es extremadamente simple. Un ejemplo simple es el siguiente:
// Inyecte el objeto SqlSessionTemplate configurado en Spring, singleton
@Resource(. nombre="sqlSessionTemplate")
public SqlSessionTemplate sqlSessionTemplate;
public void saveTestTrans(){
this.sqlSessionTemplate.selectList("testdomain.selectAnySql", " seleccione * de my_blog donde id='1'");
}
Aquí, SqlSessionTemplate no es solo un singleton, sino que tampoco requiere la creación y cierre manual de SqlSession p>
Pregunta 1:
Entonces la pregunta es, ¿por qué múltiples DAO pueden reutilizar SqlSessionTemplate en mybatis-spring.jar? La respuesta oficial es que SqlSessionTemplate puede ser reutilizado por múltiples DAO sin filtrar conexiones de datos, y también puede crear y liberar automáticamente conexiones de bases de datos. La respuesta oficial es que SqlSessionTemplate es seguro para subprocesos, lo que garantiza que cada subproceso utilice una sqlSession única y no entre en conflicto entre sí.
Primero, miré el código fuente de mybatis-spring y descubrí que SqlSessionTemplate es seguro para subprocesos y creará y liberará automáticamente conexiones a sqlsession a través de la interceptación de proxy y SqlSessionHolder. Mirando el constructor, cree una clase proxy que implemente la interfaz SqlSession y defina interceptores de métodos. Si llama a una instancia de una clase proxy que implementa un método definido por la interfaz SqlSession, la llamada se dirigirá al método de invocación de SqlSessionInterceptor.
Este método solicitará y liberará automáticamente la SqlSession (si Spring no administra la SqlSession, creará y liberará la sqlsession por sí mismo; si Spring administra la SqlSession, usará SqlSessionHolder para realizar las operaciones de solicitud y liberación)
La siguiente URL explorará las características de seguridad de subprocesos de SqlSessionTemplate con más detalle. Discusión detallada: blogs.com/daxin/p/3544188.html
Pregunta 2:
Pensé en ese problema en ese momento, aunque casi todos los proyectos ahora usan Spring como Programa Java. Marco básico, pero si no uso Spring para administrar mybatis, sino que solo uso el mybatis original, ¿cómo puedo construir un objeto similar a SqlSessionTemplate?
Primero, debe usar threadLocal de Java para construir el objeto sqlsession, como ThreadLocal sqlSession = new ThreadLocal
().
Después de buscar, descubrí que mybatis también tiene una clase para implementar funciones similares. La ruta de clase es: org.apache.ibatis.session.SqlSessionManager, pero no hay anotaciones. de mybatis-spring Después del artefacto, mybatis dejó de mantener esta clase.
Esta clase implementa SqlSessionFactory, SqlSession y define un objeto sqlssion TreadLocal en él. Al mismo tiempo, la interceptación de proxy se utiliza para la gestión automática de sqlsession. Usted mismo puede ver el código específico. de mybatis y el mecanismo de proxy de java Muy útil.
Entonces, escriba un programa simple para verificar si SqlSessionManager es realmente seguro para subprocesos y cree y publique automáticamente una nueva sqlssion: TestSqlManager.java
private static SqlSession sqlSession
public static SqlSession getSqlSessionTest(){
if(sqlSession == null){
//Construye SqlSessionFactory para usar
SqlSessionFactory sqlSessionFactory = MyBatisUtil .getSqlSessionFactory();
sqlSession = SqlSessionManager.newInstance(sqlSessionFactory);
}
devuelve sqlSession;
}
p>public static void main(String[] args) lanza InterruptedException {
Run run = new Run();
Lista
hilos = nueva ArrayList
();
for (int i = 0; i lt; 100; i) {
Hilo t = nuevo Hilo(ejecutar)
threads.p> System.out.println("hilo: {" t.getName() "}, inicio
t.start(); p >
}
for (Subproceso t: subprocesos) {
System.out.println("subproceso: {" t.getName() "}, unirse") ;
t.join();
}
}
Instalé mysql localmente y utilicé declaraciones de monitoreo para que funcionara normalmente. : seleccione SUBSTRING_INDEX(host, ':', 1) como ip, count(*) del grupo information_schema.processlist por ip; se encontró que hay concurrencia de conexiones durante la ejecución, pero todas las conexiones se liberan después de la ejecución.