数据库连接池与DBUtils工具

news/2024/5/20 15:47:45 标签: 数据库, 服务器, java

一、学习目标
1、数据连接池
2、DBUtils工具
二、重点知识
1、什么是数据连接池?
在JDBC编程中,每次创建和断开Connection对象都会消耗一定的时间和IO资源。这是因为在Java程序与数据库之间建立连接时,数据库端要验证用户名和密码,并且要为这个连接分配资源,Java程序则要把代表连接的java.sql.Connection对象等加载到内存中,所以建立数据库连接的开销很大,尤其是在大量的并发访问时。假如某网站一天的访问量是10万,那么,该网站的服务器就需要创建、断开连接10万次,频繁地创建、断开数据库连接势必会影响数据库的访问效率,甚至导致数据库崩溃。
所以数据池主要是用来对数据库内的对象进行连接管理的,应用程序不需要创建和断开连接对象,而是交给数据库连接池管理,数据库连接池断开,不是销毁对象,而是把连接对象归还给连接池。
在这里插入图片描述
1.1连接池的工作原理主要由三部分组成,分别为:
1)连接池的建立
2)连接池中连接的使用管理
3)连接池的关闭
(1)连接池的建立。一般在系统初始化时,连接池会根据系统配置建立,并在池中创建了几个连接对象,以便使用时能从连接池中获取。连接池中的连接不能随意创建和关闭,这样避免了连接随意建立和关闭造成的系统开销。Java中提供了很多容器类可以方便的构建连接池,例如Vector、Stack等。
(2)连接池的管理。连接池管理策略是连接池机制的核心,连接池内连接的分配和释放对系统的性能有很大的影响。其管理策略是:
1)当客户请求数据库连接时,首先查看连接池中是否有空闲连接,如果存在空闲连接,则将连接分配给客户使用;如果没有空闲连接,则查看当前所开的连接数是否已经达到最大连接数,如果没达到就重新创建一个连接给请求的客户;如果达到就按设定的最大等待时间进行等待,如果超出最大等待时间,则抛出异常给客户。
2)当客户释放数据库连接时,先判断该连接的引用次数是否超过了规定值,如果超过就从连接池中删除该连接,否则保留为其他客户服务。

  • 在使用它之前我们先提出一个问题:为什么要使用数据库连接池?
    影响一个系统使用感受的因素是方方面面的,比如电脑配置,业务逻辑代码写的低效率,又或者数据渲染过慢,其中都是以数据为一个中间点,提到数据必然会想到数据库
    (1)数据库连接是一件费时的操作,连接池可以使多个操作共享一个连接;
    (⒉)数据库连接池的基本思想就是为数据库连接建立一个“缓冲池”。预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时,只需从“缓冲池”中取出一个,使用完毕之后再放回去。我们可以通过设定连接池最大连接数来防止系统无尽的与数据库连接。更为重要的是我们可以通过连接池的管理机制监视数据库的连接的数量、使用情况,为系统开发,测试及性能调整提供依据;
    (3)使用连接池是为了提高对数据库连接资源的管理。

1.2 连接池的建立,连接池中连接的使用管理,连接池的关闭:
(1)连接池的建立:创建几个连接对象,以便使用的时候能从连接池中获取;
(2)客户请求数据库连接时,首先查看连接池中是否有空闲连接,若存在,将连接分配给用户使用;如果没有空闲连接,则查看当前所开的连接数是否已经达到最大的连接数,如果没有达到,就重新创建一个连接给请求的客户,如果达到就按照设定的最大等待时间进行等待,超出的最大等待的时间,就抛出异常给用户,当用户释放数据连接的时候,先判断该连接的引用次数是否超过了规定的值,如果超过就删除,如果没有的话,就保留为其他客户服务。保证了数据库连接的有效复用,避免频繁的建立、释放连接所带来的系统资源的资源开销;
(3)连接池的关闭,当应用程序退出的时,要关闭所有的连接,释放相关的资源,正好与创建相反的。
1.3 数据库连接池的最小连接数和最大连接数设置时要考虑几个因素:
(1)最小连接数:是连接池一直保持的数据库连接,所以如果应用程序对数据库连接的使用量不大,将会有大量的数据库连接资源被浪费;
(2)最大连接数:是连接池能申请的最大连接数,如果数据库连接请求超过次数,后面的数据库连接请求将被加入到等待队列中,这会影响以后的数据库操作;
(3)最小连接数与最大连接数相差大:最先连接请求的会获利,之后超过最小连接数量的连接请求等价于建立一个新的数据库连接,不过这些大于最小连接数的数据库连接在使用完不会马上被释放,他将被放到连接池中等待重复使用或是空间超时后被释放。
1.4 数据源中包含数据库连接池。如果数据是水,数据库就是水库,数据源就是连接到水库的管道,终端用户看到的数据集是管道里流出来的水。一些开源组织提供了数据源的独立实现,常用的有DBCP数据源和C3P0数据源。
(1)DataSource 接口
负责与数据库建立连接,并定义了返回值为Connection对象的方法:

1)Connection getConnection()
2)Connection getConnection(String username, String password()

相同点:它们都能用来获取Connection对象;
不同点:第1个方法是通过无参的方式建立与数据库的连接;
第2个方法是通过传入登录信息的方式建立与数据库的连接。
通常把实现了javax.sql.DataSource接口的类称为数据源。数据源中存储了所有建立数据库连接的信息,通过提供正确的数据源名称,可以找到相应的数据库连接。
数据源中包含数据库连接池。如果数据是水,数据库就是水库,数据源就是连接到水库的管道,终端用户看到的数据集是管道里流出来的水。一些开源组织提供了数据源的独立实现,常用的有DBCP数据源和C3P0数据源。
(2)DBCP(DataBase Connection Pool) 数据源
它是Apache组织下的开源连接池实现,也是Tomcat服务器使用的连接池组件。单独使用DBCP数据源时,需要在应用程序中导入两个JAR包:

1.commons-dbcp.jar包
commons-dbcp.jar包是DBCP数据源的实现包,包含所有操作数据库连接信息和数据库连接池初始化信息的方法,并实现了DataSource接口的getConnection()方法。
2.commons-pool.jar包
commons-pool.jar包是DBCP数据库连接池实现包的依赖包,为commons-dbcp.jar包中的方法提供了支持。
  • 在使用ComboPooledDataSource(String configName)方法创建对象时必须遵以下两点:
    (1)配置文件名称必须为c3p0-config.xml或者c3p0.properties,并且位于该项目的src根目录下。
    (2)当传入的configName值为空或者不存在时,则使用默认的配置方式创建数据源。
    2、DBUtils工具
    为更加简单化的使用JDBC,Apache组织提供了一个DBUtils工具,它是操作数据库的一个组件,实现了对JDBC的简单封装,可以在不影响性能的情况下极大地简化JDBC的编码工作量。
    DBUtils工具的核心类是org.apache.commons.dbutils.QueryRunner类和org.apache.commons.dbutils.ResultSetHandler接口。
    2.2 QueryRunner 类
    QueryRunner类简化了执行SQL语句的diamante,它与ResultSetHandler组合在一起就能完成大部分的数据库操作,大大地减少了编码量。QueryRunner类提供了带有一个参数的构造方法,该方法以javax.sql.DataSource作为参数传递到QueryRunner的构造方法中类获取Connection对象。针对不同的数据库操作,QueryRunner类提供了几种常见的方法:
1)query(String sql, ResultSetHandler rsh, Object…params)方法
该方法用于执行查询操作,它可以从提供给构造方法的数据源DataSource或使用的setDataSource()方法中获得连接。
2)update(String sql, Object…params)方法
该方法用于执行插入、更新或者删除操作,其中,参数params表示SQL语句中的置换参数。
3)update(String sql)方法
该方法用来执行插入、更新或者删除操作,它不需要置换参数。

2.3 ResultSetHandler 接口
ResultSetHandler接口用于处理ResultSet结果集,它可以将结果集中的数据转换为不同的形式。根据结果集中数据类型的不同,ReusltSetHandler提供了几种常见的实现类:

1)BeanHandler:将结果集中的第1行数据封装到一个对应的JavaBean实例中;
2)BeanLisHandler:将结果集中的每一行数据都封装到一个对应的JavaBean实例中,并存放到List里;
3)ScalarHandler:将结果集中某一条记录的其中某一列的数据存储成Object对象。

如果上述实现类没有提供想要的功能,可以通过自定义一个实现ResultSetHandler接口的类,然后通过重写handler()方法,实现结果集的处理。
2.4 ResultSetHandler 实现类
1.BeanHandler和BeanListHandler
BeanHandler和BeanLisHandler实现类是将结果集中的数据封装到对应的JavaBean实例中,这也是实际开发中最常用的结果集处理方法。接下来,通过代码实现来学习如何使用BeanHandler和BeanListHandler以及两者的区别。

三、实际运用
1、数据连接池
1.1 通过ComboPooleDataSource()构造方法创建数据源对象,
需要手动给数据源对象设置属性值,然后获取数据库连接对象,创建Web项目,导入mysql-connector-java-5.0.8-bin.jar、commons-dbcp-1.4.jar以及commons-pool-1.6.jar这三个包。
在这里插入图片描述
代码示例:

package cn.itcast.chapter10.example;
import java.sql.Connection;
import java.sql.SQLException;
import javax.sql.DataSource;
import org.apache.commons.dbcp2.BasicDataSource;
import com.mysql.cj.jdbc.DatabaseMetaData;
public class Example01 {
    public static DataSource ds = null;
    static {
        BasicDataSource bds = new BasicDataSource();
        bds.setDriverClassName("com.mysql.jsbc.Driver");
        bds.setUrl("jdbc:mysql://localhost:3306/jdbc");
        bds.setUsername("root");
        bds.setPassword("itcast");
        bds.setInitialSize(5);
        bds.setMaxActive(5);
        ds = bds;
    }
    public static void main(String[] args) throws SQLException {
    	Connection conn = ds.getConnection();
    	DatabaseMetaData metaData = conn.getMetaData();
    	System.out.println(metaData.getURL()+",UserName="+metaData.getUserName()+","+metaData.getDriverName());
    }
}

运行结果:
在这里插入图片描述
1.1.1 通过读取配置文件创建数据源对象,从而获取连接对象
(1)使用BasicDataSourceFactory工厂类读取配置文件,创建数据源对象,然后读取数据库连接对象。
1)在该包cn.itcast.chapter10.example下创建一个Example02类,该类中采用了从配置文件中获取数据库的连接信息和数据源的初始化信息。
代码示例:

#连接设置
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/jdbc
username=root
password=itcast
#初始化连接
initialSize=5
#最大连接数量
maxActive=10
#最大空闲连接
maxIdle=10

该类中采取从配置文件中获取数据库的连接信息的数据源的初始化信息的方式。

package cn.itcast.chapter10.example;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.SQLException;
import java.util.Properties;
import javax.sql.DataSource;
import org.apache.commons.dbcp.BasicDataSourceFactory;
public class Example02 {
	public static DataSource ds = null;
	static {
		Properties prop = new Properties();
		try {
			InputStream in = new Example02().getClass().getClassLoader()
					.getResourceAsStream("dbcpconfig.properties");
			prop.load(in);
			ds = BasicDataSourceFactory.createDataSource(prop);
		} catch (Exception e) {
			throw new ExceptionInInitializerError(e);
		}
	}
	public static void main(String[] args) throws SQLException {
		Connection conn = ds.getConnection();
		DatabaseMetaData metaData = conn.getMetaData();
         System.out.println(metaData.getURL()
         +",UserName="+metaData.getUserName()   
         +","+metaData.getDriverName());	
    }
}

(2)C3P0 数据源
C3P0是目前最流行的开源数库连接池之一,它实现了DataSource数据源接口,支持JDBC2和JDBC3的标准规范,易于扩展并且性能优越,著名的开源框架Hibernate和Spring都支持该数据源。在使用C3P0开发时,需要了解C3P0中DataSource接口的实现类ComboPooleDataSource,它是C3P0的核心类,提供了数据源对象的相关方法:

方法名称功能描述
void setDriverClass()设置连接数据库的驱动名称
void setJdbcUri()设置连接数据库的路径
void setUser()设置数据库的登录账号
void setPassword()设置数据库的登录密码
void setMaxPoolSize()设盟数据库连接池最大的连接数目
void setMinPoolSize()设置数据库连接池最小的连接数目
void setMinPoolSize()设置数据库连接池初始化的连接数目
Connection getConnection()数据库连接池中获取一个连接

当使用C3P0数据源时,首先需要创建数据源对象,创建数据源对象可以使用:ComboPooledDataSource类,该类有两个构造方法,分别是ComboPooleDataSource()和ComboPooledDataSource(String configName)。

(3) 通过ComboPooleDataSource()构造方法创建数据源对象,需要手动给数据源对象设置属性值获取数据库连接对象:
1)在项目chapter10中导入JAR包c3p0-0.9.1.2.jar,然后在cn.itcast.chapter10.example包下创建一个Example03类,该类采用C3P0数据源手动代码的方式获取Connection对象。
在这里插入图片描述
代码示例:

package cn.itcast.chapter10.example;
 
import java.sql.SQLException;
 
import javax.activation.DataSource;
 
public class Example03 {
	public static DataSource ds = null;
	static {
		ComboPooledDataSource cpds = new ComboPooledDataSource();
		try {
			cpds.setDirverClass("com.mysql.jdbc.Dirver");
			cpds.setJdbcUrl("jdbc:mysql://localhost:3306/jdbc");
			cpds.setUser("root");
			cpds.setPassword("itcast");
			cpds.setInitialPoolSize(5);
			cpds.setMaxPoolSize(15);
			ds = cpds;
		} catch (Exception e) {
			throw new ExceptionInInitializerError(e);
		}
	}
	public static void main(String[] args) throws SQLException {
		System.out.println(ds.getConnection());
	}
}

运行结果:
在这里插入图片描述
(4)使用ComboPooledDataSource(String configName)构造方法读取c3p0-config.xml配置文件,从而创建数据源对象,然后获取数据库连接对象。
1)在src根目录下创建一个c3p0-config.xml文件,用于设置数据库的连接信息和数据源的初始化信息。
代码示例:

<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
	<default-config>
		<property name="dirverClass">com.mysql.jdbc.Driver</property>
		<property name="jdbcUrl">
			jdbc:mysql://localhost:3306/jdbc
		</property>
		<property name="user">root</property>
		<property name="password">itcast</property>
		<property name="checkoutTimeout">30000</property>
		<property name="initialPoolSize">10</property>
		<property name="maxIdleTime">30</property>
		<property name="maxPoolSize">100</property>
		<property name="mainPoolSize">10</property>
		<property name="maxStatements">200</property>
	</default-config>
	<name-config name="itcast">
		<property name="dirverClass">com.mysql.jdbc.Driver</property>
		<property name="jdbcUrl">
			jdbc:mysql://localhost:3306/jdbc
		</property>
		<property name="user">root</property>
		<property name="password">itcast</property>
		<property name="initialPoolSize">5</property>
		<property name="maxPoolSize">15</property>
	</name-config>
</c3p0-config>

2)在cn.itcast.chapter10.example包下创建一个Example04类,该类中使用C3P0数据源从配置文件中获取Connection对象。
代码示例:

package cn.itcast.chapter10.example;
 
import java.sql.SQLException;
 
import javax.activation.DataSource;
 
public class Example04 {
	public static DataSource ds = null;
	static {
		ComboPooledDataSource cpds = new ComboPooledDataSource("itcast");
		ds = cpds;
	}
	public static void main(String[] args) throws SQLException {
		System.out.println(ds.getConnection());
	}
}

运行结果:
在这里插入图片描述
2、DBUtils工具
1)在名为jdbc的数据库中创建数据表user
代码示例:

CREATE TABLE USER (
	id INT(3) PRIMARY KEY AUTO_INCREMENT,
	NAME VARCHAR(20) NOT NULL,
	PASSWORD VARCHAR(20) NOT NULL
);
INSERT INTO USER(NAME,PASSWORD) VALUES ('zhangsan','123456');
INSERT INTO USER(NAME,PASSWORD) VALUES ('lisi','123456');
INSERT INTO USER(NAME,PASSWORD) VALUES ('wangwu','123456');

运行结果:
在这里插入图片描述
将下载的DBUtis工具的JAR包commons- dbutils- 1.6.jar添加到项目的lib目录中,并将第9章中文件9-5 JDBCUtils.java复制到cn.itcast.chapter10.example包下。
2) 在chapter10项目的cn.itcast chapter10. example包中创建-一个名为BaseDao的类,该类中编写了一个通用的查询方法。
代码示例:

package cn.itcast.chapter10.example;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import org.apache.commons.dbutils.ResultSetHandler;
public class BaseDao {
	public static Object query(String sql, ResultSetHandler<?> rsh, Object... params) throws SQLException {
		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		try {
			conn = JDBCUtils.getConection();
			pstmt = conn.prepareStatement(sql);
			for (int i = 0; params != null && i < params.length; i++) {
				pstmt.setObject(i + 1, params[i]);
			}
			//发送sql
			rs = pstmt.executeQuery();
			//让调用者去实现对结果集的处理
			Object obj = rsh.handle(rs);
			return obj;
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			//释放资源
			JDBCUtils.release(rs, pstmt, conn);
		}
		return rs;
	}
}

3)再创建实体类User,使用该类来创建User对象
代码示例:

package cn.itcast.chapter10.example;
public class User {
	private int id;
	private String name;
	private String password;
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
}

4)ResultSetTest1,该类用于演示BeanHandler类对结果集的处理
代码示例:

package cn.itcast.chapter10.example;
import java.sql.SQLException;
import org.apache.commons.dbutils.ResultSetHandler;
public class ResultSetTest1 {
	public static void testBeanHandler() throws SQLException {
		BaseDao basedao = new BaseDao();
		String sql = "select * from user where id=?";
		User user = (User) basedao.query(sql, newBeanHandler(User.class), 1);
		System.out.println("id为1的User对象的name值为:"+user.getName());
	}
	private static ResultSetHandler<?> newBeanHandler(Class<User> class1) {
		// TODO Auto-generated method stub
		return null;
	}
	public static void main(String[] args) throws SQLException {
		testBeanHandler();
	}
}

5)执行类ResultSetTest1中的main()方法
代码示例:

package cn.itcast.chapter10.example;
import java.sql.SQLException;
import org.apache.commons.dbutils.handlers.BeanHandler;
public class ResultSetTest1 {
	public static void testBeanHandler() throws SQLException {
		BaseDao basedao = new BaseDao();
		String sql = "select * from user where id=?";
		Object object = basedao.query(sql, new BeanHandler(User.class), 1);
		if (object!=null && object instanceof User){
			User user= (User) object;
			System.out.print("id为1的User对象的name值为:" + user.getName());
		}else {
			System.out.println("查询结果为空: "+object);
		}
	}
	public static void main(String[] args) throws SQLException {
		testBeanHandler();
	}
}

运行结果:
在这里插入图片描述
6)创建类ResultSetTest2用于演示BeanListHandler类对结果集的处理

package cn.itcast.chapter10.example;
import java.sql.SQLException;
import java.util.ArrayList;
import org.apache.commons.dbutils.handlers.BeanListHandler;
public class ResultSetTest2 {
	public static void testBeanListHandler() throws SQLException {
		BaseDao basedao = new BaseDao();
		String sql = "select * from user";
		ArrayList<User> list = (ArrayList<User> basedao.query(sql, new BeanListHandler(User.class));
		for (int i = 0; i < list.size(); i++) {
			System.out.println("第"+(i+1)+"条数据的username值为:"+list.get(i).getName());
		}
	}
	public static void main(String[] args) throws SQLException {
		testBeanListHandler();
	}
}

运行结果:
在这里插入图片描述
2.1ScalarHandler
这个方法是用于处理单行单列的数据,多用于聚合函数的查询,但是以一个点需要注意,就是当聚合函数是涉及到
数字类型的时候,一定要注意返回值类型的转换。有的人会选用Integer,long等类型,这些严格来说都是不合法
的,例如,long类型最大只能容纳20的阶乘,21的阶乘就会包异常,所以我们要选用Number(这个是所有数据类型)
的父类,并且对外提供的有Number.intValue()和Number.LongValue()等方法。
在使用DBUtils工具操作数据库时,如果需要输出结果集中一行数据的指定字段值,可以使用ScalarHandler类。
1)创建类ResultSetTest3用于演示ScalarHandler类的使用方法
代码示例:

package cn.itcast.chapter10.example;
import java.sql.SQLException;
import org.apache.commons.dbutils.handlers.ScalarHandler;
public class ResultSetTest3 {
	public static void testScalarHandler() throws SQLException {
		BaseDao basedao = new BaseDao();
		String sql = "select * from user where id=?";
		Object arr = (Object) basedao.query(sql, new ScalarHandler("name"), 1);
		System.out.println(arr);
	}
	public static void main(String[] args) throws SQLException {
		testScalarHandler();
	}
}

运行结果:
在这里插入图片描述
今天的学习就到这里,加油~


http://www.niftyadmin.cn/n/1231997.html

相关文章

mysql 5.5.41 下载_mysql5.5.41的安装

wget -c http://dev.mysql.com/get/Downloads/MySQL-5.5/mysql-5.5.41-linux2.6-x86_64.tar.gztar -zxvf mysql-5.5.41-linux2.6-x86_64.tar.gz我本来想应该是这样安装{cmake -DCMAKE_INSTALL_PREFIX/usr/local/mysql-5.5.41 \-DMYSQL_DATADIR/usr/local/mysql-5.5.41/data \-D…

drupal mysql hash密码_php-Drupal的默认密码加密方法是什么?

php-Drupal的默认密码加密方法是什么&#xff1f;我试图弄清楚Drupal 6/7默认使用什么安全性来存储密码。 是MD5&#xff0c;AES&#xff0c;SHA吗&#xff1f; 我一直找不到任何东西。5个解决方案68 votesDrupal 8和Drupal 7默认使用SHA512加盐。 他们多次通过PHP的哈希函数运…

mysql数据备份合理计划_计划备份mysql数据库

1:mysql是我们使用最多的数据库&#xff0c;如果在日常中正确的对mysql数据进行备份&#xff0c;下面我们就来做这事&#xff0c;通过脚本来实现##########################################################################################################################…

mysql无限分类表结构_MySql无限分类结构

无限分类是我们开发中非常普遍的应用&#xff0c;例如论坛&#xff0c;CMS类别&#xff0c;并且应用特别多.我们最常用和最简单的方法是MySql中的ID&#xff0c;parentID&#xff0c;名称:优点是结构简单.缺点是效率不高&#xff0c;因为每次递归都必须查询&#xff0c;并且在有…

JavaWeb的文件上传和下载

一、学习目标 文件上传相关API 1&#xff09;Fileltem接口2&#xff09;DiskFileltemFactory类3&#xff09;ServletFieltemFactory类 文件下载 1&#xff09;实现文件下载2&#xff09;解决下载文件中文文件乱码 二、重点知识 1.文件上传的相关API 1.1 Fileltem 接口 File…

linux添加两个mysql数据库_Linux下安装两个MySQL的方法

/etc/my5.cnf修改下面的内容&#xff1a;port 3307 ###修改相关的端口socket文件生成路径把[client]和[MySQLd]中的port号都改成3307,socket /tmp/mysql.sock改成socket /tmp/mysql5.sock[client]#password your_passwordport 3307socket /tmp/mysql5.sock# Here follo…

二级导航条---竖直

<!DOCTYPE html><html lang"en"><head><meta charset"UTF-8"><title>制作二级导航菜单</title><!-- <link rel"stylesheet" href"C:\Users\zhaodada\Desktop\js\style1.css"> -->&l…

centos mysql upgrade_CentOS下简单的MySQL数据库操作

1.登录成功之后退出的话&#xff0c;直接输入quit或者exit即可。2.使用.tar.gz的包安装MySQL时&#xff0c;进入MySQL需要使用绝对路径[rootwinner ~]# /usr/local/mysql/bin/mysql -uroot单独只是输入一个"mysql" 命令是不行的&#xff0c;因为"/usr/local/mys…