Существует много форматов, которые можно использовать для сериализации объектов Python в байты. Есть плюсы и минусы для каждого из них.
Если у данных есть только список кортежей целых и дробных чисел, это делает работу довольно простой.
Предположим, это данные:
data = 100 * [(1, 1.111), (18, 1.234), (555555, 0.001), (-1, 1e70)]
Какие из них попадают в категорию «струн», мне не ясно. Наиболее очевидный формат "строки" будет str(data)
. Насколько он велик?
>>> len(str(data))
5500
Это занимает 5500 байт. Вопрос требует чего-то более сжатого. Итак, мы ищем что-то намного короче, чем 5500 байт.
JSON - очень популярный формат (это также строка). Насколько он велик?
>>> len(json.dumps(data))
5500
Он имеет такой же размер (5500 байт), но, по крайней мере, он четко определен. Это может быть меньше? Как насчет BZipped JSON ?
>>> len(bz2.compress(json.dumps(data).encode('utf-8')))
131
Это намного лучше!
Это, вероятно, было очень хорошо из-за повторяющегося паттерна. Есть ли формат, в котором не используется архивирование? Может быть, рассол ?
>>> len(pickle.dumps(data))
862
Не так хорошо, как почтовый индекс (конечно!), Но все же хорошо.
Можем ли мы сделать рассол BZipped ?
>>> len(bz2.compress(pickle.dumps(data)))
155
Лучше, но нет никаких причин, чтобы он был лучше, чем BZipped JSON.
Как насчет другого формата? Вы можете преобразовать каждый кортеж в эквивалент этой структуры C , используя модуль struct :
struct {
int i;
double f;
};
Однако, тогда вы должны будете знать, насколько большой INT может быть. Python int может быть настолько большим, насколько вы хотите, но если вы, например, Знайте, что все числа находятся в диапазоне от 0 до 255, вам просто нужен один байт. Для float вам нужно 64 бита (то есть 8 байт), иначе вы потеряете точность. Таким образом, это увеличится до 1000 байтов. Не очень хорошо.
Есть также другие встроенные опции, описанные в документации Python по сохранению .
Вы также можете придумать свой собственный формат.
В конце концов, вы должны решить, что подходит вам больше всего.
JndiLocatorSupport
имеет свойство resourceRef
. При установке этого верного, "java:comp/env /" префикс будет предварительно ожидаться автоматически. Таким образом, я полагаю, что это было бы корректно для дифференциации этого параметра при перемещении от Tomcat до Weblogic.
Как использовать одно имя JNDI в вашем веб-приложении
Я сам боролся с этим несколько месяцев. Лучшее решение - сделать ваше приложение переносимым, чтобы у вас было одинаковое имя JNDI как в Tomcat, так и в Weblogic.
Чтобы сделать это, вы измените web.xml
и spring-beans.xml
так, чтобы они указывали на одно имя jndi, и предоставили сопоставление каждому jndi-имени конкретного поставщика.
Я разместил каждый файл ниже.
Вам необходимо:
<resource-ref />
в web.xml для вашего приложения, чтобы использовать одно имя WEB-INF/weblogic.xml
для сопоставления вашего имени jndi с ресурс, управляемый WebLogic META-INF/context.xml
для сопоставления вашего имени jndi с ресурсом, управляемым Tomcat Как правило, предпочитайте, чтобы ваши имена jndi были в вашем приложении, такие как jdbc/MyDataSource
и jms/ConnFactory
, и избегайте их префикса с java:comp/env/
.
Кроме того, источники данных и фабрики соединений лучше всего управляются контейнером и используются с JNDI. Это распространенная ошибка - создавать экземпляры пулов соединений с базой данных в вашем приложении .
весна
<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:jee="http://www.springframework.org/schema/jee"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.0.xsd">
<jee:jndi-lookup jndi-name="jdbc/appds"
id="dataSource" />
</beans>
web.xml
<resource-ref>
<description>My data source</description>
<res-ref-name>jdbc/appds</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
weblogic.xml
<?xml version="1.0" encoding="UTF-8" ?>
<weblogic-web-app
xmlns="http://xmlns.oracle.com/weblogic/weblogic-web-app"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://xmlns.oracle.com/weblogic/weblogic-web-app http://http://www.oracle.com/technology/weblogic/weblogic-web-app/1.1/weblogic-web-app.xsd">
<resource-description>
<jndi-name>appds</jndi-name>
<res-ref-name>jdbc/appds</res-ref-name>
</resource-description>
</weblogic-web-app>
META-INF / context.xml (для Tomcat)
<Context>
<ResourceLink global="jdbc/appds" name="jdbc/appds" type="javax.sql.DataSource"/>
</Context>
Следующий конфиг работает в Tomcat и Weblogic для меня.
Весной:
<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
<!-- This will prepend 'java:comp/env/' for Tomcat, but still fall back to the short name for Weblogic -->
<property name="resourceRef" value="true" />
<property name="jndiName" value="jdbc/AgriShare" />
</bean>
В Weblogic Admin Console создайте ресурс JDBC с именем jdbc/AgriShare
. В разделе «Цели» УБЕДИТЕСЬ, ЧТО ВЫ ПРЕДНАЗНАЧАЕТЕ ДАННЫЕ НА СЕРВЕР, НА КОТОРЫЙ ВЫ РАЗРАБОТАЕТЕ СВОЕ ПРИЛОЖЕНИЕ! . Этот конкретный момент стоил мне времени только сейчас ...
Как насчет evironment переменной? Машины разработчиков набора с именем кота и производство с названием Weblogic. Можно даже установить код для использования по умолчанию (WebLogic) в случае, если переменная не существует.
Как вы ссылаетесь на ресурс весной?
Это то, что мы имеем для tomcat:
контекст:
<Resource name="jms/ConnectionFactory" auth="Container" type="org.apache.activemq.ActiveMQConnectionFactory" description="
JMS Connection Factory"
factory="org.apache.activemq.jndi.JNDIReferenceFactory" brokerURL="tcp://localhost:61615" brokerName="StandaloneAc
tiveMQBroker"/>
весна:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:util="http://www.springframework.org/schema/util"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:jee="http://www.springframework.org/schema/jee"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-2.0.xsd
http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd">
<jee:jndi-lookup jndi-name="jms/ConnectionFactory" id="connectionFactory" resource-ref="true"
expected-type="javax.jms.ConnectionFactory" lookup-on-startup="false"/>
Пространство имен Джи происходит из:
http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.0.xsd
В моем приложении также была похожая проблема, и я решил ее следующим образом:
1) WEB-INF/classes/application.properties
содержит запись:
ds.jndi=java:comp/env/jdbc/tcds
2) На машине WLS я есть запись в файле /etc/sysenv
:
ds.jndi=wlsds
3) Я настроил пружину для поиска JNDI по свойству ${ds.jndi}
, используя bean-компонент PropertyPlaceholderConfigurer
с classpath:application.properties
и file:/etc/sysenv
как местах. Я также установил ignoreResourceNotFound
в true
, чтобы разработчикам не нужно было /etc/sysenv
на своих машинах.
4) Я запустил интеграционный тест с использованием Cargo + Jetty и не смог правильно настроить среду JNDI. Итак, у меня есть запасной вариант BasicDataSource
, настроенный тоже с использованием свойства defaultObject
из JndiObjectFactoryBean
.
Мне удалось уловить трюк с Tomcat и WebLogic с помощью Spring. Вот описание того, как это работало для меня.