JAVA 增量更新-Linux生成差分包

本案例环境,软件版本

    CentOS 7.3

    jdk-8u11-linux-x64.tar.gz

    bsdiff-4.3.tar.gz

    bzip2-1.0.6.tar.gz

 

github:点击打开链接

1. 解压bsdiff-4.3.tar.gz

    结构如下:

        

2. 安装bzip2

    1. 在线安装,随便选一个

        yum -y install bzip2-devel.x86_64

        yum -y install bzip2-devel.i686

    2. 源码安装

        解压bzip2-1.0.6.tar.gz

        进入解压后的目录执行命令

        make && make install

3. 测试分成差分包

    目录结构

        

    执行命令

    ./bsdiff old.zip new.zip patch.zip  

     

    成功生成了patch差分包

4. 使用java调用

    4.1 创建java类,内容如下

package com.lkb.bsdiff;

/**
 * @author Conbing
 * @date 2018/06/07
 */

public class BsDiffUtil {

    private static BsDiffUtil instance = new BsDiffUtil();

    public static BsDiffUtil getInstance(){
        return instance;
    }

    public native int bsDiffFile(String oldFile, String newFile, String patchFile);

    static{
        System.loadLibrary("BsDiffLkb");
    }
} 

 

 

 

 
4.2 用javah生成.h文件
    
    javah com.lkb.bsdiff.BsDiffUtil
    将生成的com_lkb_bsdiff_BsDiffUtil.h该文件放入/usr/lee/bsdiff-4.3(解压目录中)

5. 生成.so文件

    5.1 将jdk中的两个文件移动到/usr/lee/bsdiff-4.3(解压目录中)

         /usr/lib/jvm/jdk1.8/include/linux/jni_md.h

         /usr/lib/jvm/jdk1.8/include/jni.h

    5.2 修改bsdiff.c文件及com_lkb_bsdiff_BsDiffUtil.h文件

        bsdiff.c添加如下内容

            

        com_lkb_bsdiff_BsDiffUtil.h修改如下内容

            

    5.3 在bsdiff.c末尾添加native方法的实现

JNIEXPORT jint JNICALL Java_com_lkb_bsdiff_BsDiffUtil_bsDiffFile
        (JNIEnv *env, jobject jobj, jstring joldfile, jstring jnewfile, jstring jpatchfile)
{
    int restlt = -1;
    int argc = 4;
    char *argv[4];

    char *oldPath = (char*)(*env)->GetStringUTFChars(env, joldfile, NULL);
    char *newpath = (char*)(*env)->GetStringUTFChars(env, jnewfile, NULL);
    char *patchPath = (char*)(*env)->GetStringUTFChars(env, jpatchfile, NULL);
    argv[0] = "bsdiff";
    argv[1] = oldPath;
    argv[2] = newpath;
    argv[3] = patchPath;

    restlt = main(argc, argv);

    (*env)->ReleaseStringUTFChars(env, joldfile, oldPath);
    (*env)->ReleaseStringUTFChars(env, jnewfile, newpath);
    (*env)->ReleaseStringUTFChars(env, jpatchfile, patchPath);
    return restlt;
}

 

 

6. 编译bsdiff.c成.so文件
    执行命令:gcc bsdiff.c -lbz2 -fPIC -shared -o libBsDiffLkb.so
    (
        注意,咱们加载文件方法是System.loadLibrary("BsDiffLkb");
        在Linux下程序默认就会去找libBsDiffLkb
        如果提示找不到.so文件的话
        可以打印一下当前java环境library路径
        System.out.println( System.getProperty("java.library.path"));
        将.so文件放置打印目录的任一位置即可

7. 将.so文件路径添加到系统环境变量中

    vim /ect/profile

    export LD_LIBRARY_PATH=.

    export LIBRARY_PATH=/usr/lee/bsdiff-4.3 (.so文件在这个路径)

    source /ect/profile

8. 测试程序代码

import com.lkb.bsdiff.BsDiffUtil;

/**
 * @author lkb
 * @date 2018/06/07
 */
public class Test {

    public static void main(String[] args) {
        System.out.println("开始生成差分包");
        BsDiffUtil.getInstance().bsDiffFile("old.zip","new.zip","patch.zip");
        System.out.println("生成结束");
    }


}

 

目录结构

        

   把文件放置解压后的bsdiff-4.3文件夹中

        

        编译

        

       执行

        

Java增量更新和全量更新通常是指数据库中数据的更新增量更新是指只更新发生了改变的数据,而不是全部数据。实现方式可以通过在每个数据上添加时间戳或者版本号,当数据发生改变时,只更新时间戳或者版本号发生了改变的数据。 全量更新是指更新全部数据。实现方式可以通过将新数据和旧数据进行比较,然后将旧数据更新为新数据。 在Java中实现增量更新和全量更新可以使用JDBC或者ORM框架(如Hibernate)来操作数据库。下面是一个使用JDBC实现增量更新的示例代码: ```java Connection conn = DriverManager.getConnection(url, username, password); PreparedStatement pstmt = conn.prepareStatement("UPDATE table SET column = ? WHERE id = ?"); pstmt.setString(1, "new value"); pstmt.setInt(2, 1); int rows = pstmt.executeUpdate(); ``` 下面是一个使用JDBC实现全量更新的示例代码: ```java Connection conn = DriverManager.getConnection(url, username, password); PreparedStatement pstmt = conn.prepareStatement("SELECT * FROM table WHERE id = ?"); pstmt.setInt(1, 1); ResultSet rs = pstmt.executeQuery(); if (rs.next()) { // get old data int oldColumnValue = rs.getInt("column"); // get new data int newColumnValue = 2; // update data PreparedStatement updatePstmt = conn.prepareStatement("UPDATE table SET column = ? WHERE id = ?"); updatePstmt.setInt(1, newColumnValue); updatePstmt.setInt(2, 1); int rows = updatePstmt.executeUpdate(); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值