我试图使用System.Web从服务器下载文件.它确实有效,但有些链接给我带来了麻烦.链接看起来像这样:
http://cdn.somesite.com/r1KH3Z%2FaMY6kLQ9Y4nVxYtlfrcewvKO9HLTCUBjU8IBAYnA3vzE1LGrkqMrR9Nh3jTMVFZzC7mxMBeNK5uY3nx5K0MjUaegM3crVpFNGk6a6TW6NJ3hnlvFuaugE65SQ4yM5754BM%2BLagqYvwvLAhG3DKU9SGUI54UAq3dwMDU%2BMl9lUO18hJF3OtzKiQfrC/the_file.ext
Run Code Online (Sandbox Code Playgroud)
代码看起来基本上是这样的:
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(link);
WebResponse response = request.getResponse();
Run Code Online (Sandbox Code Playgroud)
getResponse()始终抛出异常(错误400错误请求).但是,我知道该链接有效,因为我可以使用Firefox下载该文件而不会出现问题.
我也尝试用Uri.UnescapeDataString(链接)解码链接,但该链接甚至不能在Firefox中工作.
其他链接以这种方式完美地工作..只是这些不起作用.
好的,我发现了一些使用wireshark的东西:
如果我使用Firefox打开链接,则发送:
&ME3@"dM*PNyAo PA:]GET /r1KH3Z%2FaMY6kLQ9Y4nVxYp5DyNc49t5kJBybvjbcsJJZ0IUJBtBWCgri3zfTERQught6S8ws1a%2BCo0RS5w3KTmbL7i5yytRpn2QELEPUXZTGYWbAg5eyGO2yIIbmGOcFP41WdrFRFcfk4hAIyZ7rs4QgbudzcrJivrAaOTYkEnozqmdoSCCY8yb1i22YtEAV/epd_outpost_12adb.flv HTTP/1.1
Host: cdn.somesite.com
User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:12.0) Gecko/20100101 Firefox/12.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: de-de,de;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Connection: keep-alive
Run Code Online (Sandbox Code Playgroud)
我认为只有第一行是问题,因为WebRequest.Create(link)解码了url:
&MEz.@!dM/nP9@~P>.GET /r1KH3Z/aMY6kLQ9Y4nVxYp5DyNc49t5kJBybvjbcsJJZ0IUJBtBWCgri3zfTERQught6S8ws1a%2BCo0RS5w3KTmbL7i5yytRpn2QELEPUXZTGYWbAg5eyGO2yIIbmGOcFP41WdrFRFcfk4hAIyZ7rs6Mmh1EsQQ4vJVYUwtbLBDNx9AwCHlWDfzfSWIHzaaIo/epd_outpost_12adb.flv HTTP/1.1
User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:12.0) Gecko/20100101 Firefox/12.0
Host: cdn.somesite.com
Run Code Online (Sandbox Code Playgroud)
(%2F替换为/)
我发现Uri类自动解码url:Uri uri = new Uri(link); //链接未解码Debug.WriteLine(uri.ToString()); //链接在此解码.
我怎么能阻止这个?
在此先感谢您的帮助.
我在hibernate中遇到麻烦而没有在多租户设置中关闭(hikari)连接池.这是hibernate session-factory配置:
<session-factory>
<property name="hibernate.dialect">org.hibernate.dialect.PostgreSQL82Dialect</property>
<property name="hibernate.multiTenancy">SCHEMA</property>
<property name="hibernate.multi_tenant_connection_provider">foundation.hibernate.TaxonomyMultiTenantConnectionProvider</property>
<property name="hibernate.jdbc.batch_size">100</property>
<property name="hibernate.order_inserts">true</property>
<property name="hibernate.hikari.dataSourceClassName">org.postgresql.ds.PGSimpleDataSource</property>
<property name="hibernate.hikari.minimumIdle">50</property>
<property name="hibernate.hikari.connectionTestQuery">SELECT 1</property>
<property name="hibernate.hikari.maximumPoolSize">200</property>
<property name="hibernate.hikari.idleTimeout">28000000</property>
<property name="hibernate.hikari.maxLifetime">28000000</property>
<property name="hibernate.hikari.connectionTimeout">10000</property>
<property name="hibernate.hikari.dataSource.applicationName">Taxonomy Workbench</property>
<property name="show_sql">true</property>
<property name="format_sql">true</property>
<mapping class="dal.models.DbProduct"/>
</session-factory>
Run Code Online (Sandbox Code Playgroud)
TaxonomyMultiTenantConnectionProvider的实现如下:
package foundation.hibernate;
import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
import foundation.hibernate.TenantDoesNotExistException.TenantDoesNotExistException;
import org.hibernate.engine.config.spi.ConfigurationService;
import org.hibernate.engine.jdbc.connections.spi.MultiTenantConnectionProvider;
import org.hibernate.service.spi.ServiceRegistryAwareService;
import org.hibernate.service.spi.ServiceRegistryImplementor;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Properties;
public class TaxonomyMultiTenantConnectionProvider implements MultiTenantConnectionProvider, ServiceRegistryAwareService, AutoCloseable {
private HikariDataSource dataSource;
@Override
public void injectServices(ServiceRegistryImplementor serviceRegistry) { …Run Code Online (Sandbox Code Playgroud) 我正在经历实时聚合而不是实时更新。我有什么遗漏的吗?
2.4.2使用当前 docker 镜像的版本的可重现示例timescale/timescaledb:latest-pg12:
CREATE TABLE data
(
time TIMESTAMPTZ NOT NULL,
value DOUBLE PRECISION NOT NULL
);
SELECT create_hypertable('data', 'time', chunk_time_interval => interval '1d');
INSERT INTO data (time, value)
VALUES ('2020-01-01', 100);
CREATE MATERIALIZED VIEW data_daily WITH (timescaledb.continuous)
AS
SELECT time_bucket('1 day', time) AS time,
avg(value) AS avg,
count(*) AS count
FROM data
GROUP BY 1;
ALTER MATERIALIZED VIEW data_daily SET (timescaledb.materialized_only = false);
Run Code Online (Sandbox Code Playgroud)
现在,当我运行时,SELECT * FROM data_daily我得到了预期的结果:
time, avg, count
2020-01-01 00:00:00.000000, 100, …Run Code Online (Sandbox Code Playgroud) 我目前在spring boot中有以下配置设置:
application.properties
app.database.host=${DB_HOST}
app.database.port=${DB_PORT}
app.database.name=${DB_NAME}
app.database.user=${DB_USER}
app.database.password=${DB_PASSWORD}
app.database.schema=${DB_SCHEMA:public}
spring.datasource.url=jdbc:postgresql://${app.database.host}:${app.database.port}/${app.database.name}
spring.datasource.username=${app.database.user}
spring.datasource.password=${app.database.password}
spring.datasource.driver-class-name=org.postgresql.Driver
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect
Run Code Online (Sandbox Code Playgroud)
application-local-dev.properties:
app.database.host=${DB_HOST:localhost}
app.database.port=${DB_PORT:5432}
app.database.name=${DB_NAME:db_name}
app.database.user=${DB_USER:root}
app.database.password=${DB_PASSWORD:root}
app.database.schema=${DB_SCHEMA:public}
Run Code Online (Sandbox Code Playgroud)
application-load-fixtures.properties:
spring.profiles.include=local-dev
spring.profiles.active=load-fixtures,local-dev
app.database.name=${DB_NAME:db_name}_fixtures
Run Code Online (Sandbox Code Playgroud)
这里的想法是,在默认模式下启动应用程序时,如果缺少数据库名称等关键属性,它将无法启动.它们应该通过环境变量传递.
出于开发目的,在设置项目时这是不必要的开销,因为我们有一个具有静态凭据的docker容器,并且我想将它们作为默认值提供.因此,我创建了一个配置文件local-dev,它将使用默认值来连接到我们的docker数据库,并且仍然能够通过环境变量覆盖它们,以防有人需要.直到这里,一切正常.
但是现在,我们还有一个用于将数据夹加载到数据库中的配置文件(删除所有表,重新创建并用数据填充它们).出于显而易见的原因,我想确保无法在任意数据库上执行此操作,因此我创建了一个load-fixtures应继承所有属性的配置文件local-dev并覆盖数据库名称.但是,这种方法似乎是错误的.我可以在spring日志中看到配置文件已正确加载:
2017-11-16 13:32:11.508 INFO 23943 --- [ main] Main:
The following profiles are active: load-fixtures,local-dev
Run Code Online (Sandbox Code Playgroud)
但它仍然使用local-dev配置文件提供的数据库名称.
当我删除该行
app.database.name=${DB_NAME:db_name}
Run Code Online (Sandbox Code Playgroud)
从local-dev配置文件,它的工作原理.
但是,我想要避免的是必须向两者添加新属性,local-dev并且load-fixtures每当我们向项目添加新的配置属性时.
我知道配置文件特定属性优先于非配置文件特定属性.此外,非默认位置属性优先于默认位置的属性.但是在这里,两个配置文件(local-dev和load-fixtures)都在同一个位置,它们也都是特定于配置文件的.
有什么方法可以解决这个问题?
提前致谢!
bad-request ×1
c# ×1
hibernate ×1
java ×1
multi-tenant ×1
spring-boot ×1
timescaledb ×1
webrequest ×1