+ All Categories
Home > Technology > Plmce2015 java 101 - david bennett

Plmce2015 java 101 - david bennett

Date post: 17-Jul-2015
Category:
Upload: david-bennett
View: 104 times
Download: 1 times
Share this document with a friend
66
David Bennett QA Engineer April 15 th , 2015 Using MySQL with Java Q2 2014
Transcript
Page 1: Plmce2015   java 101 - david bennett

David BennettQA Engineer

April 15th, 2015

Using MySQL with JavaQ2 2014

Page 2: Plmce2015   java 101 - david bennett

www.percona.com2

Who are you?

Java Experts, Intermediate, Beginners

MySQL Experts, Intermediate, Beginners

Developers, DBAs, System Admins

Just interested

Page 3: Plmce2015   java 101 - david bennett

www.percona.com3

Me

QA Engineer at Percona Designer/Developer/Consultant 20+ years in technology 15+ years working with MySQL 15+ years working with Java Focused on web apps Linux devotee I love MySQL, I like Java

Dave Bennett

Page 4: Plmce2015   java 101 - david bennett

www.percona.com4

Basic Topology

Java Application(Web, Service, Desktop)

Java Runtime Engine(JRE)

JDBC Interface

JDBC Driver (Connector/J)

MySQL

Page 5: Plmce2015   java 101 - david bennett

www.percona.com5

What is JDBC?

A standardized interface between Java and SQL

JDBC is to Java what ODBC is to Windows

Virtually all Java/SQL applications use JDBC

Like ODBC, JDBC is used more and more on

Servers, Desktop use waning.

Page 6: Plmce2015   java 101 - david bennett

www.percona.com6

What is Connector/J?

Most widely used JDBC Driver for MySQL today

Started life in 1998 as MM.MySQL (M. Matthews)

Acquired by MySQL AB in 2002

Owned by Oracle today, available under GPLv2

JDBC Type 4 – 100% Java – No Middleware

Page 7: Plmce2015   java 101 - david bennett

www.percona.com7

import java.sql.*;public class MysqlVersion { public static void main(String[] args) throws SQLException,ClassNotFoundException { Class.forName( "com.mysql.jdbc.Driver" ); Connection con = DriverManager.getConnection( "jdbc:mysql://localhost/test","user","pwd" ); Statement st = con.createStatement(); ResultSet rs = st.executeQuery( "SELECT concat('Hello from mysql ',version()) AS msg" ); if (rs.next()) { System.out.println(rs.getString("msg")); } rs.close(); st.close(); con.close(); }}

Page 8: Plmce2015   java 101 - david bennett

www.percona.com8

import java.sql.*;public class MysqlVersion { public static void main(String[] args) throws SQLException,ClassNotFoundException { Class.forName( "com.mysql.jdbc.Driver" ); Connection con = DriverManager.getConnection( "jdbc:mysql://localhost/test","user","pwd" ); Statement st = con.createStatement(); ResultSet rs = st.executeQuery( "SELECT concat('Hello from mysql ',version()) AS msg" ); if (rs.next()) { System.out.println(rs.getString("msg")); } rs.close(); st.close(); con.close(); }}

Page 9: Plmce2015   java 101 - david bennett

www.percona.com9

import java.sql.*;public class MysqlVersion { public static void main(String[] args) throws SQLException,ClassNotFoundException { Class.forName( "com.mysql.jdbc.Driver" ); Connection con = DriverManager.getConnection( "jdbc:mysql://localhost/test","user","pwd" ); Statement st = con.createStatement(); ResultSet rs = st.executeQuery( "SELECT concat('Hello from mysql ',version()) AS msg" ); if (rs.next()) { System.out.println(rs.getString("msg")); } rs.close(); st.close(); con.close(); }}

Page 10: Plmce2015   java 101 - david bennett

www.percona.com10

import java.sql.*;public class MysqlVersion { public static void main(String[] args) throws SQLException,ClassNotFoundException { Class.forName( "com.mysql.jdbc.Driver" ); Connection con = DriverManager.getConnection( "jdbc:mysql://localhost/test","user","pwd" ); Statement st = con.createStatement(); ResultSet rs = st.executeQuery( "SELECT concat('Hello from mysql ',version()) AS msg" ); if (rs.next()) { System.out.println(rs.getString("msg")); } rs.close(); st.close(); con.close(); }}

Page 11: Plmce2015   java 101 - david bennett

www.percona.com11

import java.sql.*;public class MysqlVersion { public static void main(String[] args) throws SQLException,ClassNotFoundException { Class.forName( "com.mysql.jdbc.Driver" ); Connection con = DriverManager.getConnection( "jdbc:mysql://localhost/test","user","pwd" ); Statement st = con.createStatement(); ResultSet rs = st.executeQuery( "SELECT concat('Hello from mysql ',version()) AS msg" ); if (rs.next()) { System.out.println(rs.getString("msg")); } rs.close(); st.close(); con.close(); }}

Page 12: Plmce2015   java 101 - david bennett

www.percona.com12

import java.sql.*;public class MysqlVersion { public static void main(String[] args) throws SQLException,ClassNotFoundException { Class.forName( "com.mysql.jdbc.Driver" ); Connection con = DriverManager.getConnection( "jdbc:mysql://localhost/test","user","pwd" ); Statement st = con.createStatement(); ResultSet rs = st.executeQuery( "SELECT concat('Hello from mysql ',version()) AS msg" ); if (rs.next()) { System.out.println(rs.getString("msg")); } rs.close(); st.close(); con.close(); }}

Page 13: Plmce2015   java 101 - david bennett

www.percona.com13

import java.sql.*;public class MysqlVersion { public static void main(String[] args) throws SQLException,ClassNotFoundException { Class.forName( "com.mysql.jdbc.Driver" ); Connection con = DriverManager.getConnection( "jdbc:mysql://localhost/test","user","pwd" ); Statement st = con.createStatement(); ResultSet rs = st.executeQuery( "SELECT concat('Hello from mysql ',version()) AS msg" ); if (rs.next()) { System.out.println(rs.getString("msg")); } rs.close(); st.close(); con.close(); }}

Page 14: Plmce2015   java 101 - david bennett

www.percona.com14

import java.sql.*;public class MysqlVersion { public static void main(String[] args) throws SQLException,ClassNotFoundException { Class.forName( "com.mysql.jdbc.Driver" ); Connection con = DriverManager.getConnection( "jdbc:mysql://localhost/test","user","pwd" ); Statement st = con.createStatement(); ResultSet rs = st.executeQuery( "SELECT concat('Hello from mysql ',version()) AS msg" ); if (rs.next()) { System.out.println(rs.getString("msg")); } rs.close(); st.close(); con.close(); }}

Page 15: Plmce2015   java 101 - david bennett

www.percona.com15

import java.sql.*;public class MysqlVersion { public static void main(String[] args) throws SQLException,ClassNotFoundException { Class.forName( "com.mysql.jdbc.Driver" ); Connection con = DriverManager.getConnection( "jdbc:mysql://localhost/test","user","pwd" ); Statement st = con.createStatement(); ResultSet rs = st.executeQuery( "SELECT concat('Hello from mysql ',version()) AS msg" ); if (rs.next()) { System.out.println(rs.getString("msg")); } rs.close(); st.close(); con.close(); }}

Page 16: Plmce2015   java 101 - david bennett

16 www.percona.com

Page 17: Plmce2015   java 101 - david bennett

www.percona.com17

Connector/J Basic* URL

jdbc:mysql://[host][:port]/[database][?prop=val[&prop=val]]

Where: is:host TCP/IP host (defaults to IPV4 127.0.0.1)port TCP/IP port (defaults to 3306)database Database name (defaults to none)prop A configuration propertyval The configuration property's value

* There are more advanced options for other protocols (IPV6, Named Pipes), replication, failover, load balancing, etc...

Page 18: Plmce2015   java 101 - david bennett

www.percona.com18

Connector/J URL Examples

jdbc:mysql://Connect the MySQL server at 127.0.0.1 on port 3306 without specifying a database. You must use Connection.setCatalog("{database}") or database.table reference in queries.

jdbc:mysql://dbserverConnect the MySQL server dbserver on port 3306 without specifying a database. You must use Connection.setCatalog("{database}") or database.table reference in queries.

jdbc:mysql://dbserver:3307/mydbConnect the MySQL server dbserver on port 3307 using database mydb.

jdbc:mysql://dbserver/mydbConnect the MySQL server dbserver on port 3306 using database mydb.

Page 19: Plmce2015   java 101 - david bennett

www.percona.com19

Connector/J URL Examples

jdbc:mysql://Connect the MySQL server at 127.0.0.1 on port 3306 without specifying a database. You must use Connection.setCatalog("{database}") or database.table reference in queries.

jdbc:mysql://dbserverConnect the MySQL server dbserver on port 3306 without specifying a database. You must use Connection.setCatalog("{database}") or database.table reference in queries.

jdbc:mysql://dbserver:3307/mydbConnect the MySQL server dbserver on port 3307 using database mydb.

jdbc:mysql://dbserver/mydbConnect the MySQL server dbserver on port 3306 using database mydb.

Page 20: Plmce2015   java 101 - david bennett

www.percona.com20

Connector/J URL Examples

jdbc:mysql://Connect the MySQL server at 127.0.0.1 on port 3306 without specifying a database. You must use Connection.setCatalog("{database}") or database.table reference in queries.

jdbc:mysql://dbserverConnect the MySQL server dbserver on port 3306 without specifying a database. You must use Connection.setCatalog("{database}") or database.table reference in queries.

jdbc:mysql://dbserver:3307/mydbConnect the MySQL server dbserver on port 3307 using database mydb.

jdbc:mysql://dbserver/mydbConnect the MySQL server dbserver on port 3306 using database mydb.

Page 21: Plmce2015   java 101 - david bennett

www.percona.com21

Connector/J URL Examples

jdbc:mysql://Connect the MySQL server at 127.0.0.1 on port 3306 without specifying a database. You must use Connection.setCatalog("{database}") or database.table reference in queries.

jdbc:mysql://dbserverConnect the MySQL server dbserver on port 3306 without specifying a database. You must use Connection.setCatalog("{database}") or database.table reference in queries.

jdbc:mysql://dbserver:3307/mydbConnect the MySQL server dbserver on port 3307 using database mydb.

jdbc:mysql://dbserver/mydbConnect the MySQL server dbserver on port 3306 using database mydb.

Page 22: Plmce2015   java 101 - david bennett

www.percona.com22

Connector/J URL Examples

jdbc:mysql://Connect the MySQL server at 127.0.0.1 on port 3306 without specifying a database. You must use Connection.setCatalog("{database}") or database.table reference in queries.

jdbc:mysql://dbserverConnect the MySQL server dbserver on port 3306 without specifying a database. You must use Connection.setCatalog("{database}") or database.table reference in queries.

jdbc:mysql://dbserver:3307/mydbConnect the MySQL server dbserver on port 3307 using database mydb.

jdbc:mysql://dbserver/mydbConnect the MySQL server dbserver on port 3306 using database mydb.

Page 23: Plmce2015   java 101 - david bennett

www.percona.com23

Connector/J parametersPassing in JDBC URL:

dbProperties.load(MyClass.class.getClassLoader().getResourceAsStream("db.properties"));

Connection con = DriverManager.getConnection("jdbc:mysql://", dbProperties);

Passing in a Properties file:

Connection con = DriverManager.getConnection( "jdbc:mysql://host/db?autoReconnect=true&useConfigs=maxPerformance");

MysqlDataSource mds=new MysqlDataSource();mds.setUrl("jdbc:mysql://");mds.setUser("user");mds.setPassword("pwd");mds.setAutoReconnect(true);mds.setUseConfigs("maxPerformance");Connection con=mds.getConnection();

Passing from MysqlDataSource set*() methods:

Page 24: Plmce2015   java 101 - david bennett

www.percona.com24

Connector/J parametersPassing in JDBC URL:

dbProperties.load(MyClass.class.getClassLoader().getResourceAsStream("db.properties"));

Connection con = DriverManager.getConnection("jdbc:mysql://", dbProperties);

Passing in a Properties file:

Connection con = DriverManager.getConnection( "jdbc:mysql://host/db?autoReconnect=true&useConfigs=maxPerformance");

MysqlDataSource mds=new MysqlDataSource();mds.setUrl("jdbc:mysql://");mds.setUser("user");mds.setPassword("pwd");mds.setAutoReconnect(true);mds.setUseConfigs("maxPerformance");Connection con=mds.getConnection();

Passing from MysqlDataSource set*() methods:

Page 25: Plmce2015   java 101 - david bennett

www.percona.com25

Connector/J parametersPassing in JDBC URL:

dbProperties.load(MyClass.class.getClassLoader().getResourceAsStream("db.properties"));

Connection con = DriverManager.getConnection("jdbc:mysql://", dbProperties);

Passing in a Properties file:

Connection con = DriverManager.getConnection( "jdbc:mysql://host/db?autoReconnect=true&useConfigs=maxPerformance");

MysqlDataSource mds=new MysqlDataSource();mds.setUrl("jdbc:mysql://");mds.setUser("user");mds.setPassword("pwd");mds.setAutoReconnect(true);mds.setUseConfigs("maxPerformance");Connection con=mds.getConnection();

Passing from MysqlDataSource set*() methods:

Page 26: Plmce2015   java 101 - david bennett

www.percona.com26

Connector/J parametersPassing in JDBC URL:

dbProperties.load(MyClass.class.getClassLoader().getResourceAsStream("db.properties"));

Connection con = DriverManager.getConnection("jdbc:mysql://", dbProperties);

Passing in a Properties file:

Connection con = DriverManager.getConnection( "jdbc:mysql://host/db?autoReconnect=true&useConfigs=maxPerformance");

MysqlDataSource mds=new MysqlDataSource();mds.setUrl("jdbc:mysql://");mds.setUser("user");mds.setPassword("pwd");mds.setAutoReconnect(true);mds.setUseConfigs("maxPerformance");Connection con=mds.getConnection();

Passing from MysqlDataSource set*() methods:

Page 27: Plmce2015   java 101 - david bennett

www.percona.com27

Generic JDBC App Exampleimport java.io.IOException;import java.sql.*;import java.util.Properties;public class DBHello { public static void main(String[] args) throws SQLException,ClassNotFoundException,IOException { Properties dbp = new Properties(); dbp.load(DBHello.class.getClassLoader() .getResourceAsStream("db.properties")); Class.forName(dbp.getProperty("class")); Connection con = DriverManager.getConnection(dbp.getProperty("url"), dbp); Statement st = con.createStatement(); ResultSet rs = st.executeQuery(dbp.getProperty("versionQuery")); if (rs.next()) { System.out.printf("Hello from %s\n",rs.getString("version")); } rs.close(); st.close(); con.close(); }}

Page 28: Plmce2015   java 101 - david bennett

www.percona.com28

Generic JDBC App Exampleimport java.io.IOException;import java.sql.*;import java.util.Properties;public class DBHello { public static void main(String[] args) throws SQLException,ClassNotFoundException,IOException { Properties dbp = new Properties(); dbp.load(DBHello.class.getClassLoader() .getResourceAsStream("db.properties")); Class.forName(dbp.getProperty("class")); Connection con = DriverManager.getConnection(dbp.getProperty("url"), dbp); Statement st = con.createStatement(); ResultSet rs = st.executeQuery(dbp.getProperty("versionQuery")); if (rs.next()) { System.out.printf("Hello from %s\n",rs.getString("version")); } rs.close(); st.close(); con.close(); }}

Page 29: Plmce2015   java 101 - david bennett

www.percona.com29

Generic JDBC App Exampleimport java.io.IOException;import java.sql.*;import java.util.Properties;public class DBHello { public static void main(String[] args) throws SQLException,ClassNotFoundException,IOException { Properties dbp = new Properties(); dbp.load(DBHello.class.getClassLoader() .getResourceAsStream("db.properties")); Class.forName(dbp.getProperty("class")); Connection con = DriverManager.getConnection(dbp.getProperty("url"), dbp); Statement st = con.createStatement(); ResultSet rs = st.executeQuery(dbp.getProperty("versionQuery")); if (rs.next()) { System.out.printf("Hello from %s\n",rs.getString("version")); } rs.close(); st.close(); con.close(); }}

Page 30: Plmce2015   java 101 - david bennett

www.percona.com30

Generic JDBC App Exampledb.properties configured for MySQL:# driverclass=com.mysql.jdbc.Driver# connection urlurl=jdbc:mysql://localhostuser=userpassword=pwd# parametersautoReconnect=trueuseConfigs=maxPerformance# version queryversionQuery=SELECT CONCAT_WS(' ',@@version_comment,@@version,\ @@version_compile_os,@@version_compile_machine) AS `version`

Returns:

Hello from MySQL Community Server (GPL) 5.6.23-log Linux x86_64

Page 31: Plmce2015   java 101 - david bennett

www.percona.com31

Prepared Statements

Security – Better protection from SQL injection attacks, parameters are sent separately, escaping unnecessary

Performance – Prepared Statements are re-usable. Interpretation and Optimization happens only once.

More Performance – Combined with Pooling/Caching.

Use them whenever you can.

Page 32: Plmce2015   java 101 - david bennett

www.percona.com32

Let's do something useful

Runs as a service, records storage capacity to a table Runs as a report, outputs capacity growth over time Load JDBC configuration from a Java properties file PreparedStatement Query with ResultSet Use and Reuse of PreparedStatement Batch inserts using addBatch/executeBatch Dynamic DDL creation

DiskFreeChecker.javagithub.com/dbpercona/DiskFreeChecker

Page 33: Plmce2015   java 101 - david bennett

www.percona.com33

Prepared Statement Querypst=con.prepareStatement( "SELECT * FROM diskfree WHERE `hostname` = ? AND `when` = ?");pst.setString(1, hostname);pst.setTimestamp(2, ts);rs=pst.executeQuery();while (rs.next()) { DiskFreeEntry dfe=new DiskFreeEntry(); dfe.id = rs.getLong("id"); dfe.hostname = rs.getString("hostname"); dfe.fileSystemName = rs.getString("file_system_name"); dfe.totalSpace = rs.getLong("total_space"); dfe.spaceUsed = rs.getLong("space_used"); dfe.spaceFree = rs.getLong("space_free"); dfe.percentageUsed = rs.getBigDecimal("percentage_used"); dfe.fileSystemRoot = rs.getString("file_system_root"); dfe.when = rs.getTimestamp("file_system_root"); diskFreeEntries.put(dfe.fileSystemRoot,dfe);}rs.close(); pst.close();

Page 34: Plmce2015   java 101 - david bennett

www.percona.com34

Prepared Statement Querypst=con.prepareStatement( "SELECT * FROM diskfree WHERE `hostname` = ? AND `when` = ?");pst.setString(1, hostname);pst.setTimestamp(2, ts);rs=pst.executeQuery();while (rs.next()) { DiskFreeEntry dfe=new DiskFreeEntry(); dfe.id = rs.getLong("id"); dfe.hostname = rs.getString("hostname"); dfe.fileSystemName = rs.getString("file_system_name"); dfe.totalSpace = rs.getLong("total_space"); dfe.spaceUsed = rs.getLong("space_used"); dfe.spaceFree = rs.getLong("space_free"); dfe.percentageUsed = rs.getBigDecimal("percentage_used"); dfe.fileSystemRoot = rs.getString("file_system_root"); dfe.when = rs.getTimestamp("file_system_root"); diskFreeEntries.put(dfe.fileSystemRoot,dfe);}rs.close(); pst.close();

Page 35: Plmce2015   java 101 - david bennett

www.percona.com35

Prepared Statement Querypst=con.prepareStatement( "SELECT * FROM diskfree WHERE `hostname` = ? AND `when` = ?");pst.setString(1, hostname);pst.setTimestamp(2, ts);rs=pst.executeQuery();while (rs.next()) { DiskFreeEntry dfe=new DiskFreeEntry(); dfe.id = rs.getLong("id"); dfe.hostname = rs.getString("hostname"); dfe.fileSystemName = rs.getString("file_system_name"); dfe.totalSpace = rs.getLong("total_space"); dfe.spaceUsed = rs.getLong("space_used"); dfe.spaceFree = rs.getLong("space_free"); dfe.percentageUsed = rs.getBigDecimal("percentage_used"); dfe.fileSystemRoot = rs.getString("file_system_root"); dfe.when = rs.getTimestamp("file_system_root"); diskFreeEntries.put(dfe.fileSystemRoot,dfe);}rs.close(); pst.close();

Page 36: Plmce2015   java 101 - david bennett

www.percona.com36

Prepared Statement Querypst=con.prepareStatement( "SELECT * FROM diskfree WHERE `hostname` = ? AND `when` = ?");pst.setString(1, hostname);pst.setTimestamp(2, ts);rs=pst.executeQuery();while (rs.next()) { DiskFreeEntry dfe=new DiskFreeEntry(); dfe.id = rs.getLong("id"); dfe.hostname = rs.getString("hostname"); dfe.fileSystemName = rs.getString("file_system_name"); dfe.totalSpace = rs.getLong("total_space"); dfe.spaceUsed = rs.getLong("space_used"); dfe.spaceFree = rs.getLong("space_free"); dfe.percentageUsed = rs.getBigDecimal("percentage_used"); dfe.fileSystemRoot = rs.getString("file_system_root"); dfe.when = rs.getTimestamp("file_system_root"); diskFreeEntries.put(dfe.fileSystemRoot,dfe);}rs.close(); pst.close();

Page 37: Plmce2015   java 101 - david bennett

www.percona.com37

Prepared Statement Querypst=con.prepareStatement( "SELECT * FROM diskfree WHERE `hostname` = ? AND `when` = ?");pst.setString(1, hostname);pst.setTimestamp(2, ts);rs=pst.executeQuery();while (rs.next()) { DiskFreeEntry dfe=new DiskFreeEntry(); dfe.id = rs.getLong("id"); dfe.hostname = rs.getString("hostname"); dfe.fileSystemName = rs.getString("file_system_name"); dfe.totalSpace = rs.getLong("total_space"); dfe.spaceUsed = rs.getLong("space_used"); dfe.spaceFree = rs.getLong("space_free"); dfe.percentageUsed = rs.getBigDecimal("percentage_used"); dfe.fileSystemRoot = rs.getString("file_system_root"); dfe.when = rs.getTimestamp("file_system_root"); diskFreeEntries.put(dfe.fileSystemRoot,dfe);}rs.close(); pst.close();

Page 38: Plmce2015   java 101 - david bennett

www.percona.com38

Prepared Statement Querypst=con.prepareStatement( "SELECT * FROM diskfree WHERE `hostname` = ? AND `when` = ?");pst.setString(1, hostname);pst.setTimestamp(2, ts);rs=pst.executeQuery();while (rs.next()) { DiskFreeEntry dfe=new DiskFreeEntry(); dfe.id = rs.getLong("id"); dfe.hostname = rs.getString("hostname"); dfe.fileSystemName = rs.getString("file_system_name"); dfe.totalSpace = rs.getLong("total_space"); dfe.spaceUsed = rs.getLong("space_used"); dfe.spaceFree = rs.getLong("space_free"); dfe.percentageUsed = rs.getBigDecimal("percentage_used"); dfe.fileSystemRoot = rs.getString("file_system_root"); dfe.when = rs.getTimestamp("file_system_root"); diskFreeEntries.put(dfe.fileSystemRoot,dfe);}rs.close(); pst.close();

Page 39: Plmce2015   java 101 - david bennett

www.percona.com39

Prepared Statement Querypst=con.prepareStatement( "SELECT * FROM diskfree WHERE `hostname` = ? AND `when` = ?");pst.setString(1, hostname);pst.setTimestamp(2, ts);rs=pst.executeQuery();while (rs.next()) { DiskFreeEntry dfe=new DiskFreeEntry(); dfe.id = rs.getLong("id"); dfe.hostname = rs.getString("hostname"); dfe.fileSystemName = rs.getString("file_system_name"); dfe.totalSpace = rs.getLong("total_space"); dfe.spaceUsed = rs.getLong("space_used"); dfe.spaceFree = rs.getLong("space_free"); dfe.percentageUsed = rs.getBigDecimal("percentage_used"); dfe.fileSystemRoot = rs.getString("file_system_root"); dfe.when = rs.getTimestamp("file_system_root"); diskFreeEntries.put(dfe.fileSystemRoot,dfe);}rs.close(); pst.close();

Page 40: Plmce2015   java 101 - david bennett

www.percona.com40

Prepared Statement Reusepst = con.prepareStatement("SELECT MAX(`when`) FROM diskfree " + "WHERE `when` < ( NOW() - INTERVAL ? SECOND ) " + "AND `hostname` = ?");// thenpst.setBigDecimal(1, secondsBack);pst.setString(2, hostname);rs = pst.executeQuery();if (rs.next()) { then = rs.getTimestamp(1);}rs.close();// nowpst.setInt(1, 0);rs = pst.executeQuery();if (rs.next()) { now = rs.getTimestamp(1);}rs.close();pst.close();

Page 41: Plmce2015   java 101 - david bennett

www.percona.com41

Prepared Statement Reusepst = con.prepareStatement("SELECT MAX(`when`) FROM diskfree " + "WHERE `when` < ( NOW() - INTERVAL ? SECOND ) " + "AND `hostname` = ?");// thenpst.setBigDecimal(1, secondsBack);pst.setString(2, hostname);rs = pst.executeQuery();if (rs.next()) { then = rs.getTimestamp(1);}rs.close();// nowpst.setInt(1, 0);rs = pst.executeQuery();if (rs.next()) { now = rs.getTimestamp(1);}rs.close();pst.close();

Page 42: Plmce2015   java 101 - david bennett

www.percona.com42

Prepared Statement Reusepst = con.prepareStatement("SELECT MAX(`when`) FROM diskfree " + "WHERE `when` < ( NOW() - INTERVAL ? SECOND ) " + "AND `hostname` = ?");// thenpst.setBigDecimal(1, secondsBack);pst.setString(2, hostname);rs = pst.executeQuery();if (rs.next()) { then = rs.getTimestamp(1);}rs.close();// nowpst.setInt(1, 0);rs = pst.executeQuery();if (rs.next()) { now = rs.getTimestamp(1);}rs.close();pst.close();

Page 43: Plmce2015   java 101 - david bennett

www.percona.com43

Prepared Statement Reusepst = con.prepareStatement("SELECT MAX(`when`) FROM diskfree " + "WHERE `when` < ( NOW() - INTERVAL ? SECOND ) " + "AND `hostname` = ?");// thenpst.setBigDecimal(1, secondsBack);pst.setString(2, hostname);rs = pst.executeQuery();if (rs.next()) { then = rs.getTimestamp(1);}rs.close();// nowpst.setInt(1, 0);rs = pst.executeQuery();if (rs.next()) { now = rs.getTimestamp(1);}rs.close();pst.close();

Page 44: Plmce2015   java 101 - david bennett

www.percona.com44

Prepared Statement Reusepst = con.prepareStatement("SELECT MAX(`when`) FROM diskfree " + "WHERE `when` < ( NOW() - INTERVAL ? SECOND ) " + "AND `hostname` = ?");// thenpst.setBigDecimal(1, secondsBack);pst.setString(2, hostname);rs = pst.executeQuery();if (rs.next()) { then = rs.getTimestamp(1);}rs.close();// nowpst.setInt(1, 0);rs = pst.executeQuery();if (rs.next()) { now = rs.getTimestamp(1);}rs.close();pst.close();

Page 45: Plmce2015   java 101 - david bennett

www.percona.com45

Prepared Statement Reusepst = con.prepareStatement("SELECT MAX(`when`) FROM diskfree " + "WHERE `when` < ( NOW() - INTERVAL ? SECOND ) " + "AND `hostname` = ?");// thenpst.setBigDecimal(1, secondsBack);pst.setString(2, hostname);rs = pst.executeQuery();if (rs.next()) { then = rs.getTimestamp(1);}rs.close();// nowpst.setInt(1, 0);rs = pst.executeQuery();if (rs.next()) { now = rs.getTimestamp(1);}rs.close();pst.close();

Page 46: Plmce2015   java 101 - david bennett

www.percona.com46

Prepared Statement Batchespst=con.prepareStatement( // prepare insert "INSERT INTO diskfree (`hostname`,`file_system_name`,"+ "`total_space`,`space_used`,`space_free`,`percentage_used`,"+ "`file_system_root`,`when`) VALUES (?,?,?,?,?,?,?,?)");

for (DiskFreeEntry diskFreeEntry : getDiskFreeEntries()) { pst.setString ( 1, diskFreeEntry.hostname ); pst.setString ( 2, diskFreeEntry.fileSystemName ); pst.setLong ( 3, diskFreeEntry.totalSpace ); pst.setLong ( 4, diskFreeEntry.spaceUsed ); pst.setLong ( 5, diskFreeEntry.spaceFree ); pst.setBigDecimal( 6, diskFreeEntry.percentageUsed ); pst.setString ( 7, diskFreeEntry.fileSystemRoot ); pst.setTimestamp ( 8, when ); pst.addBatch(); // add to batch}int[] inserts=pst.executeBatch(); // execute batchint totalInserts=0;for (int i : inserts) totalInserts += i; // compute total

Page 47: Plmce2015   java 101 - david bennett

www.percona.com47

Prepared Statement Batchespst=con.prepareStatement( // prepare insert "INSERT INTO diskfree (`hostname`,`file_system_name`,"+ "`total_space`,`space_used`,`space_free`,`percentage_used`,"+ "`file_system_root`,`when`) VALUES (?,?,?,?,?,?,?,?)");

for (DiskFreeEntry diskFreeEntry : getDiskFreeEntries()) { pst.setString ( 1, diskFreeEntry.hostname ); pst.setString ( 2, diskFreeEntry.fileSystemName ); pst.setLong ( 3, diskFreeEntry.totalSpace ); pst.setLong ( 4, diskFreeEntry.spaceUsed ); pst.setLong ( 5, diskFreeEntry.spaceFree ); pst.setBigDecimal( 6, diskFreeEntry.percentageUsed ); pst.setString ( 7, diskFreeEntry.fileSystemRoot ); pst.setTimestamp ( 8, when ); pst.addBatch(); // add to batch}int[] inserts=pst.executeBatch(); // execute batchint totalInserts=0;for (int i : inserts) totalInserts += i; // compute total

Page 48: Plmce2015   java 101 - david bennett

www.percona.com48

Prepared Statement Batchespst=con.prepareStatement( // prepare insert "INSERT INTO diskfree (`hostname`,`file_system_name`,"+ "`total_space`,`space_used`,`space_free`,`percentage_used`,"+ "`file_system_root`,`when`) VALUES (?,?,?,?,?,?,?,?)");

for (DiskFreeEntry diskFreeEntry : getDiskFreeEntries()) { pst.setString ( 1, diskFreeEntry.hostname ); pst.setString ( 2, diskFreeEntry.fileSystemName ); pst.setLong ( 3, diskFreeEntry.totalSpace ); pst.setLong ( 4, diskFreeEntry.spaceUsed ); pst.setLong ( 5, diskFreeEntry.spaceFree ); pst.setBigDecimal( 6, diskFreeEntry.percentageUsed ); pst.setString ( 7, diskFreeEntry.fileSystemRoot ); pst.setTimestamp ( 8, when ); pst.addBatch(); // add to batch}int[] inserts=pst.executeBatch(); // execute batchint totalInserts=0;for (int i : inserts) totalInserts += i; // compute total

Page 49: Plmce2015   java 101 - david bennett

www.percona.com49

Prepared Statement Batchespst=con.prepareStatement( // prepare insert "INSERT INTO diskfree (`hostname`,`file_system_name`,"+ "`total_space`,`space_used`,`space_free`,`percentage_used`,"+ "`file_system_root`,`when`) VALUES (?,?,?,?,?,?,?,?)");

for (DiskFreeEntry diskFreeEntry : getDiskFreeEntries()) { pst.setString ( 1, diskFreeEntry.hostname ); pst.setString ( 2, diskFreeEntry.fileSystemName ); pst.setLong ( 3, diskFreeEntry.totalSpace ); pst.setLong ( 4, diskFreeEntry.spaceUsed ); pst.setLong ( 5, diskFreeEntry.spaceFree ); pst.setBigDecimal( 6, diskFreeEntry.percentageUsed ); pst.setString ( 7, diskFreeEntry.fileSystemRoot ); pst.setTimestamp ( 8, when ); pst.addBatch(); // add to batch}int[] inserts=pst.executeBatch(); // execute batchint totalInserts=0;for (int i : inserts) totalInserts += i; // compute total

Page 50: Plmce2015   java 101 - david bennett

www.percona.com50

Prepared Statement Batchespst=con.prepareStatement( // prepare insert "INSERT INTO diskfree (`hostname`,`file_system_name`,"+ "`total_space`,`space_used`,`space_free`,`percentage_used`,"+ "`file_system_root`,`when`) VALUES (?,?,?,?,?,?,?,?)");

for (DiskFreeEntry diskFreeEntry : getDiskFreeEntries()) { pst.setString ( 1, diskFreeEntry.hostname ); pst.setString ( 2, diskFreeEntry.fileSystemName ); pst.setLong ( 3, diskFreeEntry.totalSpace ); pst.setLong ( 4, diskFreeEntry.spaceUsed ); pst.setLong ( 5, diskFreeEntry.spaceFree ); pst.setBigDecimal( 6, diskFreeEntry.percentageUsed ); pst.setString ( 7, diskFreeEntry.fileSystemRoot ); pst.setTimestamp ( 8, when ); pst.addBatch(); // add to batch}int[] inserts=pst.executeBatch(); // execute batchint totalInserts=0;for (int i : inserts) totalInserts += i; // compute total

Page 51: Plmce2015   java 101 - david bennett

www.percona.com51

Prepared Statement Batchespst=con.prepareStatement( // prepare insert "INSERT INTO diskfree (`hostname`,`file_system_name`,"+ "`total_space`,`space_used`,`space_free`,`percentage_used`,"+ "`file_system_root`,`when`) VALUES (?,?,?,?,?,?,?,?)");

for (DiskFreeEntry diskFreeEntry : getDiskFreeEntries()) { pst.setString ( 1, diskFreeEntry.hostname ); pst.setString ( 2, diskFreeEntry.fileSystemName ); pst.setLong ( 3, diskFreeEntry.totalSpace ); pst.setLong ( 4, diskFreeEntry.spaceUsed ); pst.setLong ( 5, diskFreeEntry.spaceFree ); pst.setBigDecimal( 6, diskFreeEntry.percentageUsed ); pst.setString ( 7, diskFreeEntry.fileSystemRoot ); pst.setTimestamp ( 8, when ); pst.addBatch(); // add to batch}int[] inserts=pst.executeBatch(); // execute batchint totalInserts=0;for (int i : inserts) totalInserts += i; // compute total

Page 52: Plmce2015   java 101 - david bennett

www.percona.com52

Prepared Statement Batchespst=con.prepareStatement( // prepare insert "INSERT INTO diskfree (`hostname`,`file_system_name`,"+ "`total_space`,`space_used`,`space_free`,`percentage_used`,"+ "`file_system_root`,`when`) VALUES (?,?,?,?,?,?,?,?)");

for (DiskFreeEntry diskFreeEntry : getDiskFreeEntries()) { pst.setString ( 1, diskFreeEntry.hostname ); pst.setString ( 2, diskFreeEntry.fileSystemName ); pst.setLong ( 3, diskFreeEntry.totalSpace ); pst.setLong ( 4, diskFreeEntry.spaceUsed ); pst.setLong ( 5, diskFreeEntry.spaceFree ); pst.setBigDecimal( 6, diskFreeEntry.percentageUsed ); pst.setString ( 7, diskFreeEntry.fileSystemRoot ); pst.setTimestamp ( 8, when ); pst.addBatch(); // add to batch}int[] inserts=pst.executeBatch(); // execute batchint totalInserts=0;for (int i : inserts) totalInserts += i; // compute total

Page 53: Plmce2015   java 101 - david bennett

www.percona.com53

Prepared Statement Writes

int keepDays=30;String strKeepDays=dbp.getProperty("keep.days");if (strKeepDays != null) keepDays = new Integer(strKeepDays).intValue();

pst = con.prepareStatement( "DELETE FROM diskfree WHERE `when` < ( NOW() - INTERVAL ? DAY)");

pst.setInt(1, keepDays);pst.execute();

int updateCount=pst.getUpdateCount();if (updateCount > 0) System.out.println("Cleaned up "+updateCount+" old entries.");else System.out.println("No old entries to clean up.");

pst.close();

Page 54: Plmce2015   java 101 - david bennett

www.percona.com54

int keepDays=30;String strKeepDays=dbp.getProperty("keep.days");if (strKeepDays != null) keepDays = new Integer(strKeepDays).intValue();

pst = con.prepareStatement( "DELETE FROM diskfree WHERE `when` < ( NOW() - INTERVAL ? DAY)");

pst.setInt(1, keepDays);pst.execute();

int updateCount=pst.getUpdateCount();if (updateCount > 0) System.out.println("Cleaned up "+updateCount+" old entries.");else System.out.println("No old entries to clean up.");

pst.close();

Prepared Statement Writes

Page 55: Plmce2015   java 101 - david bennett

www.percona.com55

Prepared Statement Writes

int keepDays=30;String strKeepDays=dbp.getProperty("keep.days");if (strKeepDays != null) keepDays = new Integer(strKeepDays).intValue();

pst = con.prepareStatement( "DELETE FROM diskfree WHERE `when` < ( NOW() - INTERVAL ? DAY)");

pst.setInt(1, keepDays);pst.execute();

int updateCount=pst.getUpdateCount();if (updateCount > 0) System.out.println("Cleaned up "+updateCount+" old entries.");else System.out.println("No old entries to clean up.");

pst.close();

Page 56: Plmce2015   java 101 - david bennett

www.percona.com56

Prepared Statement Writes

int keepDays=30;String strKeepDays=dbp.getProperty("keep.days");if (strKeepDays != null) keepDays = new Integer(strKeepDays).intValue();

pst = con.prepareStatement( "DELETE FROM diskfree WHERE `when` < ( NOW() - INTERVAL ? DAY)");

pst.setInt(1, keepDays);pst.execute();

int updateCount=pst.getUpdateCount();if (updateCount > 0) System.out.println("Cleaned up "+updateCount+" old entries.");else System.out.println("No old entries to clean up.");

pst.close();

Page 57: Plmce2015   java 101 - david bennett

www.percona.com57

Prepared Statement Writes

int keepDays=30;String strKeepDays=dbp.getProperty("keep.days");if (strKeepDays != null) keepDays = new Integer(strKeepDays).intValue();

pst = con.prepareStatement( "DELETE FROM diskfree WHERE `when` < ( NOW() - INTERVAL ? DAY)");

pst.setInt(1, keepDays);pst.execute();

int updateCount=pst.getUpdateCount();if (updateCount > 0) System.out.println("Cleaned up "+updateCount+" old entries.");else System.out.println("No old entries to clean up.");

pst.close();

Page 58: Plmce2015   java 101 - david bennett

www.percona.com58

Performance parameters

Parameter What it doescachePrepStmts=true If true, cache prepared statements on client side

cacheCallableStmts=true If true, cache prepared stored procedure calls

CacheServerConfiguration=true

If true, reduces connect queries by caching server configuration variables.

useLocalSessionState=true If true, reduces setup queries by using the local session state

elideSetAutoCommits=true If true, only set autocommit if the server doesn't match the client autocommit setting.

AlwaysSendSetIsolation=false

If false, doesn't set the transaction isolation level on connect. Uses server default isolation level

enableQueryTimeouts=false If false, disables query timeouts

Page 59: Plmce2015   java 101 - david bennett

www.percona.com59

Performance parameters

Parameter What it does

cachePrepStmts=true If true, cache prepared statements on client side

cacheCallableStmts=true If true, cache prepared stored procedure calls

CacheServerConfiguration=true

If true, reduces connect queries by caching server configuration variables.

useLocalSessionState=true If true, reduces setup queries by using the local session state

elideSetAutoCommits=true If true, only set autocommit if the server doesn't match the client autocommit setting.

AlwaysSendSetIsolation=false

If false, doesn't set the transaction isolation level on connect. Uses server default isolation level

enableQueryTimeouts=false If false, disables query timeouts

useConfigs=maxPerformance

Page 60: Plmce2015   java 101 - david bennett

www.percona.com60

Debugging parameters

Parameter What it doesprofileSQL=true If true, log query execution times to the

configured logger.

gatherPerfMetrics=true If true, collect performance metrics to the configured logger.

useUsageAdvisor=true If true, inefficient use of JDBC and MySQL will logged to the configured logger as warnings.

logSlowQueries=true If true, 'slow' queries will be logged to the configured logger (slowQueryThresholdMillis)

explainSlowQueries=true If true, an 'EXPLAIN' statement for slow queries will be logged to the configured logger.

Page 61: Plmce2015   java 101 - david bennett

www.percona.com61

Debugging parameters

Parameter What it doesprofileSQL=true If true, log query execution times to the

configured logger.

gatherPerfMetrics=true If true, collect performance metrics to the configured logger.

useUsageAdvisor=true If true, inefficient use of JDBC and MySQL will logged to the configured logger as warnings.

logSlowQueries=true If true, 'slow' queries will be logged to the configured logger (slowQueryThresholdMillis)

explainSlowQueries=true If true, an 'EXPLAIN' statement for slow queries will be logged to the configured logger.

useConfigs=fullDebug

Page 62: Plmce2015   java 101 - david bennett

www.percona.com62

Other Handy Parameters

autoReconnect

characterEncoding

useInformationSchema

maxRows

Page 63: Plmce2015   java 101 - david bennett

www.percona.com63

Alternative JDBC Driver

MariaDB Java ClientMaintained-ed by MariaDB teamFork from Drizzle JDBCStable release 1.1.8Compatible with:

MySQL Percona Server / PXC MariaDB

Page 64: Plmce2015   java 101 - david bennett

www.percona.com64

Alternative JDBC Driver

ProsMaybe be faster in some casesIt is under active development

ConsNot as feature richNot as mature

Page 65: Plmce2015   java 101 - david bennett

www.percona.com65

What to learn about next

Connection Pooling

DBCP, C3P0, BoneCP

JNDI / Container Managed

DataSource, Spring

Object Relational Mapping

JPA, Hibernate, Spring

Page 66: Plmce2015   java 101 - david bennett

www.percona.com66 www.percona.com

THANK YOU


Recommended