необходимо ли вызывать getConnection () в каждом классе, когда мне нужно получить соединение с помощью пула c3Po? - PullRequest
0 голосов
/ 16 января 2019

У меня есть одна jsp-страница LoginCheck.jsp, где я хочу вызвать базу данных для проверки данных для входа, и один java-класс CmDatabaseConnection, где я создаю пул соединений.

LoginCheck.jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%>
<%@ page import ="java.sql.*" %>
<%@ page import ="java.util.Date" %>
<%@ page import ="com.wipro.clk.CmDatabaseConnection" %>
<%@ page import ="com.mchange.v2.c3p0.ComboPooledDataSource" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<%
String userid = request.getParameter("username");
System.out.println("entered username is " +userid);
String pwd=request.getParameter("password"); 
System.out.println("entered password is " +pwd);

ComboPooledDataSource dataSource = CmDatabaseConnection.makeConnectionPool();

Connection con=dataSource.getConnection();


/* Class.forName ("oracle.jdbc.driver.OracleDriver");
Connection con= DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521/CCB25", "CISADM", "CISADM"); */

//
// USE BINDS ! to avoid sql injection
// push the userid and passwd comparison to the db 
// no need to get the password and compare locally
// 
String query = "select password from cmlogin where userid=? and password=?";

PreparedStatement st = con.prepareStatement(query);

st.setString(1,userid);
st.setString(2,pwd);

ResultSet rs  = st.executeQuery(); 
System.out.println("Size is  "+st.getFetchSize());
String pass1;

//  .next will advance if the query has any results
// 

if (rs.next()) {
pass1 = rs.getString("password");
System.out.println("value of result pass1" +pass1);

String name =request.getParameter("username");
System.out.println(name);
session.setAttribute("nam",name);
%> 
<jsp:forward page="admin.jsp"></jsp:forward>
<%
} else {
String msg="Username or password failed";
%>
<center> <p style="font-family:verdana;color:red;"> <%=msg %>
<jsp:include page="Login.jsp"></jsp:include>
<%  } 
con.close();
%>
</body>

CmDatabaseConnection.java

package com.wipro.clk;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

import com.mchange.v2.c3p0.ComboPooledDataSource;


public class CmDatabaseConnection {



public static ComboPooledDataSource  makeConnectionPool()
{
ComboPooledDataSource cpds = new ComboPooledDataSource();
try
{

cpds.setDriverClass("oracle.jdbc.driver.OracleDriver");
cpds.setJdbcUrl("jdbc:oracle:thin:@localhost:1521/CCB25");
cpds.setUser("CISADM");
cpds.setPassword("CISADM");
cpds.setMaxPoolSize(100);
cpds.setMinPoolSize(5);
cpds.setMaxStatements(180);  
cpds.setAcquireIncrement(20);


} 
catch (Exception ex) 
{

ex.printStackTrace();
}
return cpds;

}


}

Теперь я сомневаюсь, нужно ли звонить ниже, когда я хочу вызвать базу данных?

ComboPooledDataSource dataSource = CmDatabaseConnection.makeConnectionPool();
Connection con=dataSource.getConnection();

или возможно получить соединение с БД один раз и использовать одно и то же соединение в каждом файле java / jsp? и если мы используем то же самое в каждом файле, то не нужно ли закрывать соединение?

Ответы [ 2 ]

0 голосов
/ 16 января 2019

Необходимо использовать pool.getConnection() везде, где вам нужно соединение, и connection.close(), когда оно вам больше не нужно.

Так работает пул соединений.

Вы создаете пул соединений, получаете его из пула, когда вам это нужно (pool.getConnection()), и возвращаете его в пул, когда он вам больше не нужен (connection.close())

При использовании пула соединений он создаст (новый / набор) подключений к базе данных (на ходу / одновременно) на основе реализации пула.

Когда вы звоните, connection.close() возвращает соединение обратно в пул вместо того, чтобы разорвать соединение (ваша реализация db pool позаботится об этом).

Это функционально похоже на то, что вы хотите.

Я предлагаю Hikari Pool для Java, так как это быстро.

Comparing Hikari CP with others

0 голосов
/ 16 января 2019

Вам все еще нужно get и close соединения. Однако решение для пула соединений (например, C3P0) заботится о повторном использовании соединений и других оптимизациях.

Вы определенно не должны создавать источник данных при каждом вызове, он должен быть создан один раз. Скорее всего, лучше учитывать возможности вашего сервера приложений (например, Tomcat) для получения источника данных (например, через JNDI).

...