数据库优化12点,连接池配置代码

数据库优化12点:

  1. 在进行表格查询时 , where子句中的条件执行顺序是从左至右 , 清除数据量较大的条件应该放在左边.(特别注意: 笛卡尔积消除条件必须放在最左边)

  2. 在进行表格查询时 , 列名列表应避免使用号 ! 数据库在执行查询操作时, 会先将号展开, 转换为所有的列名, 再进行查询.

  3. 在进行表格查询时 , 能使用where条件筛选的数据, 应尽量避免使用having子句来筛选. 因为where条件执行在having之前 , 在早期筛选掉大量数据, 可以让程序执行的更顺畅.

  4. 在进行多表查询时 , 查询的表顺序是从右至左的. 应把表中数据量最少的表放在查询的最右边.

  5. 在进行多表查询时 , 应尽可能的给所有的表添加别名, 能明确的区分有冲突的列.

  6. 在使用事务时 , 应尽量多的commit , 尽量早的commit ! 原因是: 事务在未提交时, 数据库会耗费大量的内存 , 来缓存未提交的SQL结果 !

  7. 尽可能多的使用函数 来提高SQL执行的效率.

  8. SQL语句编写时, 除字符串以外 , 应使用大写字母 ! 因为SQL语句执行时, 会先将小写字母 转换为 大写字母, 再执行.

  9. 应尽可能少的访问数据库 (多次数据访问的结果可能相同, 如果缓存起来 ,可以提高程序的执行效率)

  10. 在索引列上 , 尽可能避免使用not来判断. not关键字如果判断了索引列 , 会导致此次查询索引失效 , 转而使用全表扫描的方式查询.

  11. 在索引列上, 不能使用算数运算 , 算数运算也会导致索引列使用, 使用全表扫描的方式进行查询.

  12. 在查询数据时, 如果需要使用>或<的条件, 应替换为>= 或 <= !

    原因是>和<符号 , 查询时, 是按照>= 和 <= 进行查询, 然后在撇去=的结果

连接池


1. 引入相关的jar文件
- dbcp : 连接池的代码
- poll : 连接池的依赖库

2. 创建一个properties文件, 描述连接池的配置 , 内容如下:
#数据库连接地址
url=jdbc:oracle:thin:@localhost:1521:XE
#数据库驱动地址
driverClassName=oracle.jdbc.OracleDriver
#数据库帐号
username=system
#数据库密码
password=123

#扩展配置:
#初始化连接池时, 创建的连接数量:
initialSize=5
#最大允许存在的连接数量
maxActive=200
#空闲时允许保留的最大连接数量
maxIdle=10
#空闲时允许保留的最小连接数量
minIdle=5
#排队等候的超时时间
maxWait=20000

3. 将properties文件, 转换为Properties对象.
Properties ppt = new Properties();
ppt.load(文件输入流);
4. 通过连接池工厂类(BasicDataSourceFactory) , 创建连接池对象 (一次程序启动, 创建一个连接池就够了.)
DataSource ds = BasicDataSourceFactory.createDataSource(ppt);
5. 通过连接池对象, 获取池中的连接
Connection conn = ds.getConnection();
6. 正常JDBC操作

示例代码:


// DBCPUtil工具类 *

public class DBCPUtil {

    private static DataSource dataSource;

    static {
        //在类加载时, 读取配置文件, 配置连接池
        //1.    创建Properites对象
        Properties ppt = new Properties();
        //2.    读取配置文件, 
        InputStream is = DBCPUtil.class.getClassLoader().getResourceAsStream("dbcp.properties");
        //3.    将配置文件 加载到Properties对象中
        try {
            ppt.load(is);
        //4.    通过连接池工厂类, 创建连接池
            dataSource = BasicDataSourceFactory.createDataSource(ppt);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 用于从连接池中 获取一个连接对象
     * @return 连接对象 , 如果获取失败返回null
     */
    public static Connection getConnection() {
        try {
            return dataSource.getConnection();
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
    /**
     * 用于释放资源
     * @param conn  连接对象
     * @param state 执行环境
     * @param result 结果集
     */
    public static void close(Connection conn , Statement state ,ResultSet result) {
        if(result!=null) {
            try {
                result.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if(state!=null) {
            try {
                state.close();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        if(conn!=null) {
            try {
                conn.close();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }

}




  目录