Hana数据库,Java连接池_长睡将军的博客-程序员宅基地_hana数据库

技术标签: spring  java  数据库  

 SAP Hana是个内存数据库

驱动

        <dependency>
            <groupId>com.sap.cloud.db.jdbc</groupId>
            <artifactId>ngdbc</artifactId>
            <version>2.4.64</version>
        </dependency>
package com.df.rpc.jdbc;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;
import java.io.PrintWriter;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.SQLFeatureNotSupportedException;
import java.util.LinkedList;
import java.util.logging.Logger;
import javax.annotation.PostConstruct;
import javax.sql.DataSource;

/**
 * 原生的jdbc连接池
 */

@SuppressWarnings("all")
@Slf4j
@Component
public class HanaJDBCPool implements DataSource {

    private static LinkedList<Connection> listConnections = new LinkedList<Connection>();

    @Value("${hana.db.driver}")
    String driver;
    @Value("${hana.db.url}")
    String url;
    @Value("${hana.db.username}")
    String username;
    @Value("${hana.db.password}")
    String password;

    @Value("${hana.db.initsize}")
    Integer jdbcPoolInitSize;

    @Value("${hana.db.poolmax}")
    Integer jdbcPoolMax;//必须大于init 的两倍

    @PostConstruct
    public void initHanaConnection(){
        try {
            Class.forName(driver);
            for(int i = 0;i< jdbcPoolInitSize;i++){
                Connection conn = DriverManager.getConnection(url, username, password);
                listConnections.add(conn);
            }

        } catch (Exception e) {
            throw new ExceptionInInitializerError(e);
        }
    }


    @Async
    private void createConnection(){
        try {
            Class.forName(driver);
            for(int i = 0;i< jdbcPoolInitSize;i++){
                Connection conn = DriverManager.getConnection(url, username, password);
                listConnections.add(conn);
            }

        } catch (Exception e) {
            throw new ExceptionInInitializerError(e);
        }
    }





    @Override
    public Connection getConnection() throws SQLException {
        if (listConnections.size() <= jdbcPoolMax/2){
            createConnection();
        }

        if (listConnections.size() > 0) {
            Connection conn1 = listConnections.removeFirst();
            log.debug("linkedlist1数据库连接池大小是" + listConnections.size());
            return (Connection) Proxy.newProxyInstance(conn1.getClass().getClassLoader(),
                    new Class[]{Connection.class}, new InvocationHandler() {
                        @Override
                        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                            if (!method.getName().equalsIgnoreCase("close")) {
                                return method.invoke(conn1, args);
                            } else {
                                listConnections.add(conn1);
                                log.debug(conn1 + "对象被释放,重新放回linkedlist集合中!");
                                log.debug("此时Linkedlist集合中有" + listConnections.size() + "个数据库连接对象!");
                                return null;
                            }
                        }
                    });
        } else {
            log.error(url +" 连接数据库失败!");
        }
        return null;
    }

    @Override
    public Connection getConnection(String username, String password) throws SQLException {
        return null;
    }

    @Override
    public PrintWriter getLogWriter() throws SQLException {
        return null;
    }

    @Override
    public void setLogWriter(PrintWriter out) throws SQLException {

    }

    @Override
    public void setLoginTimeout(int seconds) throws SQLException {

    }

    @Override
    public int getLoginTimeout() throws SQLException {
        return 0;
    }

    @Override
    public Logger getParentLogger() throws SQLFeatureNotSupportedException {
        return null;
    }

    @Override
    public <T> T unwrap(Class<T> iface) throws SQLException {
        return null;
    }

    @Override
    public boolean isWrapperFor(Class<?> iface) throws SQLException {
        return false;
    }



}
package com.df.rpc.jdbc;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;


@SuppressWarnings("all")
@Slf4j
@Component
public class HanaJDBCRpc {

    @Autowired
    private HanaJDBCPool pool;


    /**
     *  * 获取资源
     */
    public Connection getConnection() throws SQLException {
        return pool.getConnection();
    }
    /**
     *  * 关闭资源
     *  * @param resultSet 查询返回的结果集,没有为空
     *  * @param statement
     *  * @param connection
     */
    public void close(ResultSet resultSet, Statement statement, Connection connection) {
        if (resultSet != null) {
            try {
                resultSet.close();
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }
            resultSet = null;
        }
        if (statement != null) {
            try {
                statement.close();
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }
        }
        if (connection != null) {
            try {
                connection.close();
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }
        }
    }


}

查询结果包装 

package com.df.rpc.utils;


import java.lang.reflect.Method;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 数据库查询结果POJO转换
 *
 * @author chenyl
 */
public class HanaDbUtil {
    private static final char SEPARATOR = '_';

    public static <T> T toBean(Class<T> clazz, ResultSet rs) throws Exception {
        if (!rs.next()) {
            return null;
        }
        T t = clazz.newInstance();
        ResultSetMetaData rsmd = rs.getMetaData();
        int len = rsmd.getColumnCount();
        Map<String, Method> mm = getSetMethod(clazz);
        for (int i = 1; i <= len; i++) {
            String label = rsmd.getColumnLabel(i);
            Method m = mm.get(lineToCamel(label, true));
            if (m != null) {
                m.invoke(t, rs.getObject(label));
            }
        }
        return t;
    }

    public static Map<String, Object> toMap(ResultSet rs) throws Exception {
        Map<String, Object> map = new HashMap<String, Object>();
        if (!rs.next()) {
            return null;
        }
        ResultSetMetaData rsmd = rs.getMetaData();
        int len = rsmd.getColumnCount();
        for (int i = 1; i <= len; i++) {
            String label = rsmd.getColumnLabel(i);
            map.put(lineToCamel(label, false), rs.getObject(label));
        }
        return map;
    }

    public static Map<String, Object> toStrMap(ResultSet rs) throws Exception {
        Map<String, Object> map = new HashMap<String, Object>();
        if (!rs.next()) {
            return null;
        }
        ResultSetMetaData rsmd = rs.getMetaData();
        int len = rsmd.getColumnCount();
        for (int i = 1; i <= len; i++) {
            String label = rsmd.getColumnLabel(i);
            Object obj = rs.getObject(label);
            if (obj instanceof java.sql.Timestamp) {
                java.sql.Timestamp ts = (java.sql.Timestamp) obj;
                SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                map.put(lineToCamel(label, false), format.format(new Date(ts.getTime())));
            } else if (obj instanceof java.util.Date) {
                SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                map.put(lineToCamel(label, false), format.format((Date) obj));
            } else {
                map.put(lineToCamel(label, false), rs.getString(label));
            }
        }
        return map;
    }

    public static <T> List<T> toList(Class<T> clazz, ResultSet rs) throws Exception {
        List<T> list = new ArrayList<T>();
        while (true) {
            T t = toBean(clazz, rs);
            if (t == null) {
                break;
            }
            list.add(t);
        }
        return list;
    }

    public static List toList(ResultSet rs) throws Exception {
        List list = new ArrayList();
        while (true) {
            Map m = toMap(rs);
            if (m == null) {
                break;
            }
            list.add(m);
        }
        return list;
    }

    public static List toStrList(ResultSet rs) throws Exception {
        List list = new ArrayList();
        while (true) {
            Map m = toStrMap(rs);
            if (m == null) {
                break;
            }
            list.add(m);
        }
        return list;
    }

    private static Map<String, Method> getSetMethod(Class<?> clazz) {
        Map<String, Method> map = new HashMap<String, Method>();
        Method[] array = clazz.getMethods();
        int len = array.length;
        for (int i = 0; i < len; i++) {
            Method m = array[i];
            if (m.getName().startsWith("set") && m.getParameterTypes().length == 1) {
                map.put(m.getName().substring(3), m);
            }
        }
        return map;
    }

    public static String lineToCamel(String str, boolean firstUpperCase) {
        if (str == null || str.length() == 0) {
            return str;
        }
        str = str.toLowerCase();
        int len = str.length();
        StringBuffer sb = new StringBuffer();
        boolean upperCase = firstUpperCase;
        for (int i = 0; i < len; i++) {
            char c = str.charAt(i);
            if (c == SEPARATOR) {
                upperCase = true;
                continue;
            }
            if (upperCase) {
                sb.append(Character.toUpperCase(str.charAt(i)));
                upperCase = false;
            } else {
                sb.append(str.charAt(i));
            }
        }
        return sb.toString();
    }

    public static String camelToLine(String str) throws Exception {
        if (str == null || str.length() == 0) {
            return str;
        }
        StringBuilder sb = new StringBuilder();
        boolean nextIsUpperCase = false;
        int len = str.length();
        for (int i = 0; i < len; i++) {
            char c = str.charAt(i);
            if (i < len - 1) {
                nextIsUpperCase = Character.isUpperCase(str.charAt(i + 1));
            } else {
                nextIsUpperCase = false;
            }
            if (Character.isLowerCase(c) && nextIsUpperCase) {
                if (i < len - 1) {
                    sb.append(c).append(SEPARATOR).append(Character.toLowerCase(str.charAt(i + 1)));
                    i++;
                } else {
                    sb.append(c).append(SEPARATOR);
                }

            } else if (Character.isUpperCase(c) && !nextIsUpperCase && i > 0) {
                sb.append(SEPARATOR).append(Character.toLowerCase(str.charAt(i)));
            } else {
                sb.append(Character.toLowerCase(c));
            }

        }
        return sb.toString();
    }


    public static void close(ResultSet rs) throws SQLException {
        if (rs != null) {
            rs.close();
        }
    }

    public static void close(Connection conn) throws SQLException {
        if (conn != null) {
            conn.close();
        }
    }
}

配置文件

hana.db.name=poc-hana
hana.db.driver = com.sap.db.jdbc.Driver
#jdbc:sap://192.168.0.102:39015??DatabaseName=HXE&reconnect=true
hana.db.url=jdbc:sap://192.168.1.5:39015?reconnect=true
hana.db.username=SYSTEM
[email protected]
hana.db.initsize=5
#必须大于init 的两倍
hana.db.poolmax=12

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_33656559/article/details/119918586

智能推荐

jQuery中的函数封装_Ay192018的博客-程序员宅基地_jquery 封装函数

1.函数封装的概念:函数是由事件驱动的或者当它被调用时执行的可重复使用的代码块。用函数把重复的代码块包裹起来就是函数封装。2.封装的作用:其实就是为了减少代码的冗余,增加代码的可读性与易维护性,将实现同一功能的代码封装起来,在需要实现这一功能时调用即可。举例1 删除dom对象的空白节点:function removeNode(nodee) {for (var i = 0; i &lt; nodee.length; i ++) {if (nodee[i].nodeType === 3 &

Springmvc+Myabtis+Ajax实现异步分页emp+dept(全部查询及模糊查询)_weixin_30649641的博客-程序员宅基地

1.在项目中创建如下目录2.创建实体类Deptpackage com.entity;import java.io.Serializable;/** * 部门表 * @author Administrator * */public class Dept implements Serializable{ /** * ...

电气自动化与计算机应用哪个好,应用电子和电气这两个专业,选哪那个好?_小白大王的博客-程序员宅基地

应用电子和电气这两个专业,选哪那个好?以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!应用电子和电气这两个专业,选哪那个好?从我理解,电子是属于弱电,电气为强电应用电子应该是电子产品开发,包括产品里面的编程,电气应该是工厂,民用,供电等方面,电气的就业范围大一点,工资一般,除非在做设计和在供电部门电子就业方向是维修和产品...

docker复现网络yolov3详解_木木阳的博客-程序员宅基地_docker复现

yolov3-docker复现一、docker环境搭建二、yolov3复现这张图片就是本博客的主要内容一、docker环境的复现1.了解docker 如果读者为docker新手,或者跟我一样一知半解的话,建议百度搜索:docker-从入门到实践,这个文档对初学者帮助很大。2.由于每个人机型不一样,所以关于docker安装我这里就不再叙述了,上述给的文档说的非常详细,如果还是不会的话,可以私信我,就是我也不一定能解决的说。3.这里从docker pull开始进行详细介绍:1)docker p

SpringBoot2 线程池的定义和使用_赵小胖-0914的博客-程序员宅基地

SpringBoot2 线程池的定义和使用定义线程池@[email protected]@Configurationpublic class AsyncExecutorConfig implements AsyncConfigurer { @Bean public ThreadPoolTaskExecutor asyncServiceExecutor() { ...

c语言实现数据库系统,一个大程序"实现一个基于命令行的简单数据库系统"..._F杂谈的博客-程序员宅基地

一个大程序"实现一个基于命令行的简单数据库系统"实现一个基于命令行的简单数据库系统基本功能:1、建立数据库表2、能够对数据库中的单表进行数据导入3、能够对数据库中的单表进行插入4、能够对数据库中的单表进行查询5、能够对数据库中的单表进行更新6、能够对数据库中的单表进行删除高级功能:当数据量比较大的时候,请大家建立索引,并通过索引加快查询速度(选作)要求:1、不能使用Cstring.h,string...

随便推点

java压缩传输gzip_服务器使用Gzip压缩数据,加快网络传输(Java 例子)_MegaQubit的博客-程序员宅基地

The next version of the Project will provide support for gzip in order to faster speed of data transmission on the network。在我们的项目中,添加对gzip的支持,是为了加快数据在网络中的传输速度。If you need to transfer data using gzip, ...

android imageview 图片切换动画,Android UI控件之ImageSwitcher实现图片切换效果_weixin_39798943的博客-程序员宅基地

本文实例为大家分享了geSwitcher实现图片切换效果的具体代码,供大家参考,具体内容如下从该名字就可以看出来,ImageSwitcher是一个图片切换控件,可以在一系列的图片中,逐张的显示特定的图片,利用该控件可以实现图片浏览器中的上一张,下一张的功能。其使用方法也较为简单,不过需要注意的是ImageSwitcher在使用的时候需要一个ViewFactory,用来区分显示图片的容器和他的父窗...

Redisson PRO 、Jedis 性能比较_Go Big Or Go Home的博客-程序员宅基地_redisson和jedis效率

前言: 我们都对Redis的性能感兴趣,而且根据大多数人的知识,Redis通常以大约55000-75000 ops / sec的速度执行,所有响应延迟均为亚毫秒级。使用Redisson PRO,我们设法将限制提升到更高的水平,大约100000-213000 ops / sec,同时将延迟保持在相同的亚毫秒级别。为了衡量相对性能,我们将结果与最流行的Redis Java客户端 - Jed...

高可用集群原理_weixin_34128501的博客-程序员宅基地

一、Heartbeat的主要组件介绍集群资源管理器(CRM,ClusterResourceManager): CRM是集群系统中最主要的管理进程,它负责对整个集群资源的管理和约束,包括资源的配置及相互间依赖关系,并决定资源运行的状态、位置和顺序等.另外它还负责监控本地资源管理器完成这些工作,CRM通过与系统的每一个组件通信来相互作用和协调操作,CRM通过heartbeat通...

关于“场景”、“情境”、“直觉”的对话_人机与认知实验室的博客-程序员宅基地

【这是一段两年前的对话,朝花夕拾,共享之】Shifa 01:59直觉与是有是逻辑没有关系,存在逻辑性很强的直觉,也存在没有逻辑关系的直觉

A. Shortest path of the king_Felven的博客-程序员宅基地

time limit per test1 secondmemory limit per test64 megabytesinputstandard inputoutputstandard outputThe king is left alone on the chessboard. In spite of this lonelin