HackerGK
HackerGK

Reputation: 370

MYSQL shows too many processes from java application

i have a java application which connects to mysql database using MYSQL connector. problem is when application started, MYSQL process list shows many connections than i requested in process list (attached image).

enter image description here

i have two threads running which connects to database within 5 seconds and 11 seconds. but, when i refresh mysql process list, it shows server's host ports are changing rapidely than threads are running. normally its changing 3-5 ports per second. can someone please guide me any optimizing issues or any changes to test with this?

thanks

P.S.

I have created a class which connects to DB at initialization and that class's object is in a places where needs DB connectivity. and that class having all methods which using to query from DB.

EDIT

my database connectivity class code is

public class Data{

 static Connection con; //create connection
 static Statement stmt; //create statement
 static ResultSet rs;    //create result set
 static HostRead hr = new HostRead();
static int db_port = 3306;
static String db_root = "127.0.0.1";
static String db_name = "chsneranew";
static String db_user = "root";
static String db_pass = "";
 /**Constructer method*/
        public Data(){
            this(db_root,db_port,db_name,db_user,db_pass);
            if(getConnection()==null){
                System.out.println("error in database connection");
            }
            else{
                con = getConnection();
            }
        }

        protected void finalize() throws Throwable {
             try {
                 System.out.println("desctroyed");
                 con.close(); 
             } finally {
                 super.finalize();
             }
         }

        public static Connection getConnection(){
            try{
                Class.forName("com.mysql.jdbc.Driver").newInstance();
                Connection conn = DriverManager.getConnection("jdbc:mysql://"+db_root+":"+db_port+"/"+db_name, db_user, db_pass);
                stmt = conn.createStatement();
                return conn;
            }
            catch(ClassNotFoundException er){
                JOptionPane.showMessageDialog(null,"Error found ...\nDataBase Driver error (Invalid Drivers)\nUsers Cant login to system without database\n\nContact System Administrator","Error",JOptionPane.ERROR_MESSAGE);  
                return null;
            }
            catch(Exception er){
                JOptionPane.showMessageDialog(null,"Error found ...\nDataBase Access error (Invalid Authentication)\nOr\nDataBase not found. Details are not be loaded \n\nUsers Cant login to system without database\n\nContact System Administrator","Error",JOptionPane.ERROR_MESSAGE);
                return null;
            }       
        }

        public String getUserName(){
            try{
                Statement stmt2 = getConnection().createStatement();
                ResultSet rss2;         
                String sql = "SELECT name FROM gen";
                rss2 = stmt2.executeQuery(sql);
                if(rss2.next()){
                    return rss2.getString("name");
                }
            }
            catch(Exception er){
                er.printStackTrace();
            }   
            return null;        
        }

}

i am calling getUserName()method in my threads. using

Data d = new Data();
d.getUserName();

Upvotes: 0

Views: 219

Answers (2)

Danyal Sandeelo
Danyal Sandeelo

Reputation: 12401

conn.close(); 

You need to close the connection, the connection is not closed that is why it is still there in the list. You need to Connection conn above so that it may be visible to rest of the code.

Upvotes: 1

Progman
Progman

Reputation: 19555

You are calling the getConnection() method three times when you want to read the data via the getUserName() method. Two times in the constructor when your constructor of the Data class is called (one for the if(...) check, one for the con = getConnection() line) and one time when you actually want to read the data at the getConnection().createStatement() line. So you have three connections to the database, and that is just the getUserName method...

Rewrite your code that only one connection is established and this connection is reused for any further execution.

Upvotes: 0

Related Questions