gbase8s数据库检测非法字符

在实际项目中,数据库有可能会出现非法字符,其原因有多种,如下提供一种非法字符的检测方法,仅供参考

import java.sql.*;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
import java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

public class test {
    private static List<String> tablist= new ArrayList<String>();
    private static String url = "jdbc:gbasedbt-sqli://172.16.39.170:9099/xms:GBASEDBTSERVER=gbase01;DB_LOCALE=zh_CN.utf8;CLIENT_LOCALE=zh_CN.utf8;IFX_LOCK_MODE_WAIT=10;LOGINTIMEOUT=2000;IFX_SOC_TIMEOUT=3000;DELIMIDENT=Y";
    private static String username = "root";
    private static String password = "123456";
    private static String gettab_sql="select tabname from systables where tabid >99 and tabtype='T'";
    static{
        try {
            Class.forName("com.gbasedbt.jdbc.Driver");
        }catch (ClassNotFoundException e){
            System.out.println("class is not found\n");
        }
    }

    public static void main(String[] args) throws Exception {

        Connection connection=getConnection();
        tablist=getTabList(connection);
        System.out.println(tablist.size());
        ThreadPoolExecutor executorService = new ThreadPoolExecutor(
                5, 5, 60L, TimeUnit.SECONDS,
                new LinkedBlockingQueue<>(10),
                Executors.defaultThreadFactory(),
                new ThreadPoolExecutor.AbortPolicy()
        );


        for (String item:tablist) {
            executorService.submit(()->{
                try {
                    checkTab(item);

                }catch (Exception e){
                    e.printStackTrace();
                }
            });

        }

        executorService.shutdown();

    }

    public static synchronized void  checkTab(String tabname) throws SQLException{

            String str= UUID.randomUUID().toString();
            System.out.println("线程"+Thread.currentThread().getName()+str+" 开始");
            System.out.println("处理表名:"+tabname);
            List<String> collist = new ArrayList<String>();
            String sql = "select colname from syscolumns where tabid =(select tabid from systables where tabname='" + tabname +
                    "')" + "and coltype in (13,16,0,15,63,64,40,269,272,256,271,319,320,296);";
            Connection connection = getConnection();
            PreparedStatement ps = connection.prepareStatement(sql);
            ResultSet resultSet = ps.executeQuery();
            while (resultSet.next()) {
                collist.add(resultSet.getString(1));
            }
            for (String item : collist) {
                String sql_v1 = "select rowid," + item + " from " + tabname + ";";
                ps = connection.prepareStatement(sql_v1);
                resultSet = ps.executeQuery();
                while (resultSet.next()) {
                    try {
                        resultSet.getString(2);
                    } catch (SQLException e) {
                        int rowid = resultSet.getInt(1);
                        System.out.println("发现乱码数据-->表名:"+tabname + ",rowid:" + rowid + ",列名" + item);
                        continue;
                    }

                }

            }
            closeConnection(connection, ps, resultSet);


        System.out.println("线程"+Thread.currentThread().getName()+str+" 结束");

    }

    public static List<String> getTabList(Connection connection) throws SQLException{
        PreparedStatement ps = connection.prepareStatement(gettab_sql);
        ResultSet resultSet=ps.executeQuery();
        while(resultSet.next()){
            tablist.add(resultSet.getString(1));
        }
        closeConnection(connection,ps,resultSet);
        return tablist;
    }

    public static  Connection getConnection(){
        Connection conn =null;
        try {
            conn = DriverManager.getConnection(url, username, password);
        }catch (SQLException e){
            System.out.println("get connect error");
        }
        return conn;
    }

    public static void closeConnection(Connection conn,PreparedStatement preparedStatement,ResultSet resultSet) throws SQLException{
        resultSet.close();
        preparedStatement.close();
        conn.close();
    }
}

运行效果如图

线程pool-1-thread-1f36dfb11-f6e4-4f49-88f3-0bbd865a1d56 开始
处理表名:pca
线程pool-1-thread-1f36dfb11-f6e4-4f49-88f3-0bbd865a1d56 结束
线程pool-1-thread-576a1acb5-380f-4bc2-b4d4-f7d72be76206 开始
处理表名:mm
线程pool-1-thread-576a1acb5-380f-4bc2-b4d4-f7d72be76206 结束
线程pool-1-thread-48d159c0c-f2b0-463f-ad4e-b7a97120c33b 开始
处理表名:vv1
线程pool-1-thread-48d159c0c-f2b0-463f-ad4e-b7a97120c33b 结束
线程pool-1-thread-38e2b0f83-3f2a-45f6-9419-77f705fd23cc 开始
处理表名:vv
线程pool-1-thread-38e2b0f83-3f2a-45f6-9419-77f705fd23cc 结束
线程pool-1-thread-2f5e65d90-16a1-459d-bd72-4df87c6ce201 开始
处理表名:nr_md_alarm_current
线程pool-1-thread-2f5e65d90-16a1-459d-bd72-4df87c6ce201 结束
线程pool-1-thread-363574a97-069a-47d4-bd45-efd76fc80144 开始
处理表名:ac
线程pool-1-thread-363574a97-069a-47d4-bd45-efd76fc80144 结束
线程pool-1-thread-43f35833a-c9e4-44e5-b6d3-bdc56370e2a2 开始
处理表名:cc
线程pool-1-thread-43f35833a-c9e4-44e5-b6d3-bdc56370e2a2 结束
线程pool-1-thread-54d32cf29-4f13-4909-abf0-ff8fbbc9d5b5 开始
处理表名:bb
线程pool-1-thread-54d32cf29-4f13-4909-abf0-ff8fbbc9d5b5 结束
线程pool-1-thread-13da931da-32f3-496b-b9b7-5cdbb70913be 开始
处理表名:kk
发现乱码数据-->表名:kk,rowid:257,列名c1
线程pool-1-thread-13da931da-32f3-496b-b9b7-5cdbb70913be 结束
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值