
docker可以支持把一个宿主机上的目录挂载到镜像里。
docker run -it -v /home/dock/Downloads:/usr/Downloads ubuntu64 /bin/bash
通过-v参数,冒号前为宿主机目录,必须为绝对路径,冒号后为镜像内挂载的路径。
现在镜像内就可以共享宿主机里的文件了。
默认挂载的路径权限为读写。如果指定为只读可以用:ro
docker run -it -v /home/dock/Downloads:/usr/Downloads:ro ubuntu64 /bin/bash
docker还提供了一种高级的用法。叫数据卷。
数据卷:“其实就是一个正常的容器,专门用来提供数据卷供其它容器挂载的”。感觉像是由一个容器定义的一个数据挂载信息。其他的容器启动可以直接挂载数据卷容器中定义的挂载信息。
看示例:
docker run -v /home/dock/Downloads:/usr/Downloads --name dataVol ubuntu64 /bin/bash
创建一个普通的容器。用--name给他指定了一个名(不指定的话会生成一个随机的名子)。
再创建一个新的容器,来使用这个数据卷。
docker run -it --volumes-from dataVol ubuntu64 /bin/bash
--volumes-from用来指定要从哪个数据卷来挂载数据。
java中存储很多对象在内存是很浪费空间的,内存过于昂贵,与硬盘、磁带、光盘等外存相比,内存的价格要高2~3个数量级,而且维持成本也高,至少需要一直供电吧。所以即使对象不需要永久保存,也会因为内存的容量限制不能一直呆在内存中,需要持久化来缓存到外存。
持久化是将程序数据在持久状态和瞬时状态间转换的机制。通俗的讲,就是瞬时数据(比如内存中的数据,是不能永久保存的)持久化为持久数据(比如持久化至数据库中,能够长久保存)。
ActiveMQ持久化消息的二种方式;
1、持久化为文件
这个装ActiveMQ时默认就是这种,只要设置消息为持久化就可以了。涉及到的配置和代码有:
<persistenceAdapter>
<kahaDB directory="${activemqbase}/data/kahadb"/>
</persistenceAdapter>
producerSend(request, MsgDeliveryModePersistent, level, TimeSpanMinValue);
2、持久化为MySql
首先需要把MySql的驱动放到ActiveMQ的Lib目录下,我用的文件名字是:mysql-connector-java-504-binjar
接下来修改配置文件
<persistenceAdapter>
<jdbcPersistenceAdapter dataDirectory="${activemqbase}/data" dataSource="#derby-ds"/>
</persistenceAdapter>
在配置文件中的broker节点外增加
<bean id="derby-ds" class="orgapachecommonsdbcpBasicDataSource" destroy-method="close">
<property name="driverClassName" value="commysqljdbcDriver"/>
<property name="url" value="jdbc:mysql://localhost/activemqrelaxAutoCommit=true"/>
<property name="username" value="activemq"/>
<property name="password" value="activemq"/>
<property name="maxActive" value="200"/>
<property name="poolPreparedStatements" value="true"/>
</bean>
从配置中可以看出数据库的名称是activemq,需要手动在MySql中增加这个库。
然后重新启动消息队列,会发现多了3张表
1:activemq_acks
2:activemq_lock
3:activemq_msgs
对象持久化,也就是可以把这个对象永远的保存起来,这里的保存不仅是对象本身,还包括他的属性和所依赖的其他类。通常,对象可以持久化到文件或者是数据库中。我这里只介绍如何将对象存储到数据库中。恰巧Oracle数据库为我们提供了这样的方便。
在Oracle中,有一种blog的字段类型,它是用来存储大量的二进制数据的。我们就利用这个字段去存储对象信息。
首先建立一个测试表:
create table TESTBLOB
(
NAME VARCHAR2(50) not null,
CONTENT BLOB not null,
ID NUMBER(8) not null
)alter table TESTBLOB
add constraint IDFORTEST primary key (ID);
只用三个字段,其中id是属性,content是我们要存储对象的字段。
先来看看我们要存入的对象:
import javaioSerializable;
import javautilDate;
import javautilList;
public class TestObject implements Serializable {
private static final long serialVersionUID = 4558876142427402513L;
/
@param args
/
private String name;
private String password;
private Date date;
private List<City> cityList;
public List<City> getCityList() {
return cityList;
}
public void setCityList(List<City> cityList) {
thiscityList = cityList;
}
public Date getDate() {
return date;
}
public void setDate(Date date) {
thisdate = date;
}
public String getName() {
return name;
}
public void setName(String name) {
thisname = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
thispassword = password;
}
}
记得要实现Serializable接口,可以看到这是一个包含了string,date,和list类型的对象,为了给测试增加复杂度,我们的list是另外一个对象(city)的list,如下:
import javaioSerializable;
public class City implements Serializable{
private static final long serialVersionUID = 4558876127402513L;
private String name;
private String code;
public String getCode() {
return code;
}
public void setCode(String code) {
thiscode = code;
}
public String getName() {
return name;
}
public void setName(String name) {
thisname = name;
}
}
City对象包括了城市名称和区号。下面是主要的应用了。
import javaioBufferedInputStream;
import javaioByteArrayInputStream;
import javaioByteArrayOutputStream;
import javaioInputStream;
import javaioObjectInputStream;
import javaioObjectOutputStream;
import javaioOutputStream;
import javasqlConnection;
import javasqlDriverManager;
import javasqlResultSet;
import javasqlStatement;
import javautilArrayList;
import javautilDate;
import javautilList;
import oraclesqlBLOB;
public class Test {
public static void main(String[] args) {
//创建测试用对象
City beijing = new City();
beijingsetName("北京");
beijingsetCode("010");
City shanghai = new City();
shanghaisetName("上海");
shanghaisetCode("020");
City tianjin = new City();
tianjinsetName("天津");
tianjinsetCode("021");
List<City> cityList = new ArrayList<City>();
cityListadd(beijing);
cityListadd(shanghai);
cityListadd(tianjin);
TestObject obj = new TestObject();
objsetName("yangsq");
objsetPassword("111");
objsetDate(new Date());
objsetCityList(cityList);
try{
//将对象存入blob字段
ByteArrayOutputStream byteOut=new ByteArrayOutputStream();
ObjectOutputStream outObj=new ObjectOutputStream(byteOut);
outObjwriteObject(obj) ;
final byte[] objbytes=byteOuttoByteArray();
ClassforName("oraclejdbcdriverOracleDriver");
Connection con = DriverManagergetConnection(
"jdbc:oracle:thin:@:1521:", "yangsq", "yangsq");
consetAutoCommit(false);
Statement st = concreateStatement();
stexecuteUpdate("insert into TESTBLOB (ID, NAME, CONTENT) values (1, 'test1', empty_blob())");
ResultSet rs = stexecuteQuery("select CONTENT from TESTBLOB where ID=1 for update");
if (rsnext()) {
BLOB blob = (BLOB) rsgetBlob("CONTENT");
OutputStream outStream = blobgetBinaryOutputStream();
outStreamwrite(objbytes, 0, objbyteslength);
outStreamflush();
outStreamclose();
}
byteOutclose();
outObjclose();
concommit();
//取出blob字段中的对象,并恢复
rs = stexecuteQuery("select CONTENT from TESTBLOB where ID=1");
BLOB inblob = null;
if (rsnext()) {
inblob = (BLOB) rsgetBlob("CONTENT");
}
InputStream is = inblobgetBinaryStream();
BufferedInputStream input = new BufferedInputStream(is);
byte[] buff = new byte[inblobgetBufferSize()];
while(-1 != (inputread(buff, 0, bufflength)));
ObjectInputStream in =
new ObjectInputStream(
new ByteArrayInputStream(
buff));
TestObject w3 = (TestObject)inreadObject();
Systemoutprintln(w3getName());
Systemoutprintln(w3getPassword());
Systemoutprintln(w3getDate());
List<City> list = w3getCityList();
for(City city : list){
Systemoutprintln(citygetName() + " " + citygetCode());
}
stclose();
conclose();
} catch (Exception ex) {
exprintStackTrace();
Systemexit(1);
}
}
}
代码的蓝色部分创建了要存储的对象。再看红色的对象写入部分,它首先把对象转化成二进制流的形式。对于blob字段,我们不能简单的在insert时插入,实际上,insert时,对于blob字段,只能先插入一个空的blob对象empty_blob(),然后再进行"select CONTENT from TESTBLOB where ID=1 for update"对blob字段进行更新。返回后,我们只要把对象的二进制流写入即可。
OutputStream outStream = blobgetBinaryOutputStream();
outStreamwrite(objbytes, 0, objbyteslength);
需要注意的是,上述步骤必须设置consetAutoCommit(false),否则oracle会抛出异常。
接下来,绿色的代码是读取数据库中blob字段的对象,并恢复。我们要知道的是,所有对blob字段的 *** 作都是二进制的,即插入时是二进制流,读出时也是二进制流。然后用io修饰器(ObjectInputStream)去修饰。以前学习java时,感觉它的io好繁琐啊,现在感觉还真是各有其用。下面是测试的输出结果。
yangsq
111
Tue Mar 27 12:11:28 CST 2007
北京 010
上海 020
天津 021
需要说明一下,buff的size一定要足够大,否则将抛出异常。在这里,我使用的是inblobgetBufferSize()来设置buff的size,这并不是一种好的方法,因为一般inblobgetBufferSize()都是32768,很可能出现异常,所以这个size最好自己设置,或系统运行时刻设置(幸好java提供数组长度的运行时刻设置)。
以上就是关于docker中oracle数据库数据持久化的问题,如果将本地的文件夹挂载到docker容器中全部的内容,包括:docker中oracle数据库数据持久化的问题,如果将本地的文件夹挂载到docker容器中、java的持久化有什么用、用java代码如何设置activemq消息持久化到数据库中等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)