今天用mybatis循環插入數據的時候,插到一百條左右的時候,突然報錯,意思就是mysql連接數已經達到最大數。
我看到就想應該是插入一條數據的時候沒有釋放連接,就百度怎麼釋放連接,回答說是mybatis能自動釋放連接,但是在高併發也會出現這種結果,但是明顯這種問題不是高併發。
後來發現我在SqlSessionFactory實例化太多了,導致報錯,改成只實例化一個就好了,這個問題我感覺可能初學者會犯,記錄一下
之前的錯誤代碼
private SqlSessionFactory factory;
public static void setUp() throws Exception{
String resource = "SqlMapConfig.xml";
//通過流將核心配置文件讀取進來
InputStream inputStream = Resources.getResourceAsStream(resource);
//通過核心配置文件輸入流來創建會話工廠
factory = new SqlSessionFactoryBuilder().build(inputStream);
}
public void testFindUserById() throws Exception{
setUp();
SqlSession openSession = factory.openSession();
///通過getMapper方法來實例化接口
UserMapper mapper = openSession.getMapper(UserMapper.class);
User user = mapper.findUserById(1);
System.out.println(user);
}
改正之後
private SqlSessionFactory factory;
static {
String resource = "SqlMapConfig.xml";
//通過流將核心配置文件讀取進來
InputStream inputStream;
try {
inputStream = Resources.getResourceAsStream(resource);
//通過核心配置文件輸入流來創建會話工廠
factory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void findUserById(int id) throws Exception{
SqlSession openSession = factory.openSession();
///通過getMapper方法來實例化接口
UserMapper mapper = openSession.getMapper(UserMapper.class);
User user = mapper.findUserById(id);
openSession.commit();
openSession.close();
System.out.println(user);
}